我怎样才能比较两个列表中的Python和返回匹配

我想采取两个列表,并find出现在两个值。

a = [1, 2, 3, 4, 5] b = [9, 8, 7, 6, 5] returnMatches(a, b) 

会返回[5] ,例如。

不是最有效的方法,但是到目前为止,最明显的方法是:

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

如果顺序是显着的,你可以使用像这样的列表parsing:

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

(只适用于大小相同的列表,其顺序意义所暗示的)。

使用set.intersection() ,它是快速和可读的。

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

显示Lutz解决scheme的快速性能testing是最好的:

 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) 

这些是我的机器上的结果:

 # 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 

显然,任何人为的性能testing都应该用一粒盐来进行,但是由于set().intersection()答案至less与其他解决scheme一样快 ,而且最具可读性,所以应该是这个标准的解决scheme共同的问题。

我更喜欢基于集合的答案,但是这里有一个工作无论如何

 [x for x in a if x in b] 

最简单的方法是使用集合 :

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

快速的方法:

 list(set(a).intersection(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'])** 

你也可以试试这个,把通用的元素保存在一个新的列表中。

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

你想重复吗? 如果不是,也许你应该使用集合:

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

您可以使用

 def returnMatches(a,b): return list(set(a) & set(b)) 

您可以使用:

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

输出:

 set([1, 7, 9]) 

也可以使用itertools.product。

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

另一个更有function的方式来检查列表1(lst1)和列表2(lst2)的列表相等,其中对象有深度1,并保持顺序是:

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

如果你想要一个布尔值:

 >>> 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 

使用__and__属性方法也可以。

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

或干脆

 >>> 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