2009-09-07 34 views

Trả lời

289

Không phải là một hiệu quả nhất, nhưng do sự xa cách rõ ràng nhất để làm điều đó là:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(a) & set(b) 
{5} 

nếu trật tự rất có ý nghĩa, bạn có thể làm điều đó với comprehensions danh sách như thế này:

>>> [i for i, j in zip(a, b) if i == j] 
[5] 

(chỉ hoạt động cho các danh sách có kích thước bằng nhau, có ý nghĩa thứ tự ý nghĩa).

+5

Một lưu ý thận trọng, danh sách hiểu là * không * nhất thiết phải là lựa chọn nhanh hơn. Đối với các tập lớn hơn (ở đó hiệu năng có nhiều khả năng quan trọng nhất) so sánh bit ('&') hoặc 'set (a) .intectionection (b)' sẽ nhanh hoặc nhanh hơn danh sách hiểu. – Joshmaker

+5

Lưu ý khác: danh sách hiểu tìm thấy các giá trị xuất hiện trong cả hai ở vị trí CÙNG (đây là những gì SilentGhost có nghĩa là "thứ tự là quan trọng"). Các giải pháp giao cắt được thiết lập cũng sẽ tìm thấy các kết quả phù hợp ở các vị trí KHÁC. Đây là câu trả lời cho 2 câu hỏi khá khác nhau ... (câu hỏi của op là mơ hồ như yêu cầu) – drevicko

+0

Làm thế nào để bạn làm điều này nếu danh sách của bạn là danh sách các danh sách tức là a = [[0,0], [1, 0]] và b = [[2,3], [0,0]] – Schneems

11

Cách đơn giản nhất để làm điều đó là sử dụng sets:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(a) & set(b) 
set([5]) 
260

Sử dụng set.intersection(), nó nhanh chóng và dễ đọc.

>>> set(a).intersection(b) 
set([5]) 
+22

Câu trả lời này có hiệu suất thuật toán tốt, vì chỉ một trong các danh sách (ngắn hơn nên được ưu tiên) được chuyển thành bộ để tra cứu nhanh và danh sách khác được duyệt qua tra cứu các mục trong bộ này. – u0b34a0f6ae

+3

'bool (set (a) .intectionection (b))' cho 'True' hoặc' False' – Akshay

+0

Câu trả lời này linh hoạt và dễ đọc hơn, vì mọi người có thể cần ['different'] (https: //docs.python. org/3/library/stdtypes.html # frozenset.difference) hoặc ['union'] (https://docs.python.org/3/library/stdtypes.html#frozenset.union). –

5

Bạn có muốn bản sao? Nếu không có lẽ bạn nên sử dụng bộ thay vì:


>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5])) 
set([5]) 
+0

Nếu bạn thực sự muốn danh sách, http://www.java2s.com/Code/Python/List/Functiontointersecttwolists.htm >>> giao nhau ([1, 2, 3, 4, 5], [9, 8, 7, 6, 5]) [5] –

+0

Theo tài liệu - * ... loại bỏ các cấu trúc dễ bị lỗi như Set ('abc') & 'cbs' có lợi cho Set dễ đọc hơn ('abc'). giao lộ ('cbs'). * - http://docs.python.org/library/sets.html –

3

Bạn có thể sử dụng

def returnMatches(a,b): 
     return list(set(a) & set(b)) 
9
>>> s = ['a','b','c'] 
>>> f = ['a','b','d','c'] 
>>> ss= set(s) 
>>> fs =set(f) 
>>> print ss.intersection(fs) 
    **set(['a', 'c', 'b'])** 
>>> print ss.union(fs)   
    **set(['a', 'c', 'b', 'd'])** 
>>> print ss.union(fs) - ss.intersection(fs) 
    **set(['d'])** 
+0

Câu trả lời được chấp nhận không hoạt động đối với các danh sách chứa chuỗi. Cái này có. – Antony

39

tôi thích tập dựa câu trả lời, nhưng đây là một trong những hoạt nào

[x for x in a if x in b] 
8

Cũng bạn có thể thử điều này, bằng cách giữ các yếu tố chung trong danh sách mới.

new_list = [] 
for element in a: 
    if element in b: 
     new_list.append(element) 
64

Một thử nghiệm hiệu năng nhanh chóng cho thấy giải pháp Lutz là tốt nhất:

import time 

def speed_test(func): 
    def wrapper(*args, **kwargs): 
     t1 = time.time() 
     for x in xrange(5000): 
      results = func(*args, **kwargs) 
     t2 = time.time() 
     print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0) 
     return results 
    return wrapper 

@speed_test 
def compare_bitwise(x, y): 
    set_x = frozenset(x) 
    set_y = frozenset(y) 
    return set_x & set_y 

@speed_test 
def compare_listcomp(x, y): 
    return [i for i, j in zip(x, y) if i == j] 

@speed_test 
def compare_intersect(x, y): 
    return frozenset(x).intersection(y) 

# Comparing short lists 
a = [1, 2, 3, 4, 5] 
b = [9, 8, 7, 6, 5] 
compare_bitwise(a, b) 
compare_listcomp(a, b) 
compare_intersect(a, b) 

# Comparing longer lists 
import random 
a = random.sample(xrange(100000), 10000) 
b = random.sample(xrange(100000), 10000) 
compare_bitwise(a, b) 
compare_listcomp(a, b) 
compare_intersect(a, b) 

Đây là những kết quả trên máy tính của tôi:

# Short list: 
compare_bitwise took 10.145 ms 
compare_listcomp took 11.157 ms 
compare_intersect took 7.461 ms 

# Long list: 
compare_bitwise took 11203.709 ms 
compare_listcomp took 17361.736 ms 
compare_intersect took 6833.768 ms 

Rõ ràng, bất kỳ thử nghiệm hiệu suất nhân tạo cần được thực hiện với một hạt muối, nhưng vì câu trả lời là set().intersection()ít nhất là nhanh chóng làm các giải pháp khác và cũng là phần mềm đọc nhiều nhất le, nó phải là giải pháp tiêu chuẩn cho vấn đề thường gặp này.

1

Bạn có thể sử dụng:

a = [1, 3, 4, 5, 9, 6, 7, 8] 
b = [1, 7, 0, 9] 
same_values = set(a) & set(b) 
print same_values 

Output:

set([1, 7, 9]) 
+3

khác nhau như thế nào với câu trả lời được chấp nhận từ 6 năm trước? – tom

+1

Vâng, tôi đã viết chi tiết đầy đủ với đầu ra và tốt cho python mới bắt đầu –

1

một cách khác chức năng hơn một chút để kiểm tra bình đẳng danh sách cho danh sách 1 (lst1) và danh sách 2 (lst2) nơi đối tượng có chiều sâu một và giữ trật tự là:

all(i == j for i, j in zip(lst1, lst2)) 
3

Có thể sử dụng itertools.product quá.

>>> common_elements=[] 
>>> for i in list(itertools.product(a,b)): 
... if i[0] == i[1]: 
...  common_elements.append(i[0]) 
0

Nếu bạn muốn có một giá trị boolean:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(b) == set(a) & set(b) and set(a) == set(a) & set(b) 
False 
>>> a = [3,1,2] 
>>> b = [1,2,3] 
>>> set(b) == set(a) & set(b) and set(a) == set(a) & set(b) 
True 
0

Sử dụng phương pháp __and__ thuộc tính cũng làm việc.

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(a).__and__(set(b)) 
set([5]) 

hoặc đơn giản là

>>> set([1, 2, 3, 4, 5]).__and__(set([9, 8, 7, 6, 5])) 
set([5]) 
>>>  
1
a = [1, 2, 3, 4, 5] 
b = [9, 8, 7, 6, 5] 

lista =set(a) 
listb =set(b) 
print listb.intersection(lista) 
returnMatches = set(['5']) #output 

print " ".join(str(return) for return in returnMatches) # remove the set() 

5  #final output 
+0

Trong khi mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về cách và/hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời. –

Các vấn đề liên quan