2010-05-19 29 views
45
def common_elements(list1, list2): 
    """ 
    Return a list containing the elements which are in both list1 and list2 

    >>> common_elements([1,2,3,4,5,6], [3,5,7,9]) 
    [3, 5] 
    >>> common_elements(['this','this','n','that'],['this','not','that','that']) 
    ['this', 'that'] 
    """ 
    for element in list1: 
     if element in list2: 
      return list(element) 

Cho đến thời điểm này, nhưng dường như không làm cho nó hoạt động! Cảm ơnCác yếu tố phổ biến so sánh giữa 2 danh sách

Trả lời

97
>>> list1 = [1,2,3,4,5,6] 
>>> list2 = [3, 5, 7, 9] 
>>> list(set(list1).intersection(list2)) 
[3, 5] 
+0

+1 nhưng cá nhân tôi muốn sử dụng frozenset vì nó là bất biến và do đó có thể được sử dụng như từ điển chìa khóa vv – zebrabox

+6

này sẽ trả lại/độc đáo/yếu tố phổ biến, nhưng không phải bất kỳ yếu tố lặp đi lặp lại có thể tồn tại. – Dologan

+0

@SilentGhost. Cách lấy số phần tử phù hợp từ hai danh sách. Trong trường hợp này, nó là 2. – Poka

17

sử dụng bộ nút giao thông, thiết lập (list1) & bộ (List2)

>>> def common_elements(list1, list2): 
...  return list(set(list1) & set(list2)) 
... 
>>> 
>>> common_elements([1,2,3,4,5,6], [3,5,7,9]) 
[3, 5] 
>>> 
>>> common_elements(['this','this','n','that'],['this','not','that','that']) 
['this', 'that'] 
>>> 
>>> 

Lưu ý rằng kết quả có thể là danh sách thứ tự khác nhau với danh sách ban đầu.

+0

Cảm ơn sự giúp đỡ. Hiểu nơi tôi đã đi sai và phải làm gì vào lần sau. :) – Daniel

+0

Thats tuyệt vời, Daniel :-) – YOU

+1

giải pháp tuyệt vời. có cách nào để bảo vệ trật tự với điều này không? – tarrasch

22

Các giải pháp được đề xuất bởi S.MarkSilentGhost thường cho bạn biết cách thực hiện theo cách Pythonic, nhưng tôi nghĩ bạn cũng có thể hưởng lợi từ việc biết tại sao giải pháp của bạn không hoạt động. Vấn đề là ngay sau khi bạn tìm thấy phần tử phổ biến đầu tiên trong hai danh sách, bạn chỉ trả lại phần tử đơn đó. giải pháp của bạn có thể được cố định bằng cách tạo ra một danh sách result và thu thập các yếu tố chung trong danh sách đó:

def common_elements(list1, list2): 
    result = [] 
    for element in list1: 
     if element in list2: 
      result.append(element) 
    return result 

Một phiên bản thậm chí ngắn hơn sử dụng comprehensions danh sách:

def common_elements(list1, list2): 
    return [element for element in list1 if element in list2] 

Tuy nhiên, như tôi đã nói, đây là một cách thức hoạt động rất kém hiệu quả - Các kiểu tập hợp dựng sẵn của Python là cách hiệu quả hơn khi chúng được triển khai trong C trong nội bộ.

+0

Tuyệt vời cho cả hai đề xuất – dlewin

+0

LƯU Ý: Các phương pháp trên sẽ chỉ hoạt động cho các danh sách có kích thước bằng nhau. Nếu bạn đang làm việc với các danh sách có kích thước không bằng nhau, như tôi, thì bạn sẽ cần phải đánh giá thứ tự dựa trên len() trước khi gọi hàm: list1 = [2,2,2], list2 [2,3] - > [2,2,2] list1 = [2,3], list2 [2,2,2] -> [2] – redthumb

8

Các câu trả lời trước đây đều hoạt động để tìm các phần tử phổ biến duy nhất, nhưng sẽ không tính đến các mục lặp lại trong danh sách. Nếu bạn muốn các yếu tố chung để xuất hiện trong số tương tự như chúng được tìm thấy điểm chung trên danh sách, bạn có thể sử dụng sau một liner:

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)] 

Phần or True chỉ cần thiết nếu bạn mong đợi bất kỳ yếu tố để đánh giá thành False.

+0

Giải pháp tuyệt vời, có vẻ là kỹ lưỡng nhất, nếu một chút terse – Hendeca

+0

Điều này sẽ là câu trả lời nên đã được chọn! Tôi giả định nó cũng hoạt động cho các danh sách bất bình đẳng. Ngoài ra hầu hết các giải pháp sử dụng 'set' mà không phải là ổn định (aka thứ tự bị mất). – lifebalance

1

1) Method1 tiết kiệm list1 là từ điển và sau đó iterating mỗi elem trong List2

def findarrayhash(a,b): h1={k:1 for k in a} for val in b: if val in h1: print("common found",val) del h1[val] else: print("different found",val) for key in h1.iterkeys(): print ("different found",key) Tìm các yếu tố chung và khác nhau:

2) Method2 bằng cách sử dụng thiết lập

def findarrayset(a,b): common = set(a)&set(b) diff=set(a)^set(b) print list(common) print list(diff)

0

Dưới đây là một phương pháp khá bạo lực mà tôi đã nghĩ ra. Nó chắc chắn không phải là hiệu quả nhất nhưng nó là một cái gì đó.

Vấn đề tôi tìm thấy với một số giải pháp ở đây là nó không cung cấp các yếu tố lặp lại hoặc không cung cấp số lượng phần tử chính xác khi thứ tự đầu vào quan trọng.

#finds common elements 
def common(list1, list2): 
    result = [] 
    intersect = list(set(list1).intersection(list2)) 

    #using the intersection, find the min 
    count1 = 0 
    count2 = 0 
    for i in intersect: 
     for j in list1: 
      if i == j: 
       count1 += 1 
     for k in list2: 
      if i == k: 
       count2 += 1 
     minCount = min(count2,count1) 
     count1 = 0 
     count2 = 0 

     #append common factor that many times 
     for j in range(minCount): 
      result.append(i) 

    return result 
16

Bạn cũng có thể sử dụng bộ và nhận các điểm chung trong một dòng: trừ bộ có chứa sự khác biệt từ một trong các bộ.

A = [1,2,3,4] 
B = [2,4,7,8] 
commonalities = set(A) - (set(A) - set(B)) 
Các vấn đề liên quan