Tôi muốn lấy hai danh sách và tìm các giá trị xuất hiện trong cả hai.Làm cách nào để so sánh hai danh sách trong python và trả về kết quả phù hợp
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
returnMatches(a, b)
sẽ trả lại [5]
, chẳng hạn.
Tôi muốn lấy hai danh sách và tìm các giá trị xuất hiện trong cả hai.Làm cách nào để so sánh hai danh sách trong python và trả về kết quả phù hợp
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
returnMatches(a, b)
sẽ trả lại [5]
, chẳng hạn.
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).
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])
Sử dụng set.intersection(), nó nhanh chóng và dễ đọc.
>>> set(a).intersection(b)
set([5])
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
'bool (set (a) .intectionection (b))' cho 'True' hoặc' False' – Akshay
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). –
cách nhanh:
list(set(a).intersection(set(b)))
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])
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] –
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 –
Bạn có thể sử dụng
def returnMatches(a,b):
return list(set(a) & set(b))
>>> 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'])**
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
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]
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)
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()
là í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.
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])
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
Vâng, tôi đã viết chi tiết đầy đủ với đầu ra và tốt cho python mới bắt đầu –
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))
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])
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
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])
>>>
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
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. –
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
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
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