我想获取两个列表,并找到两者中出现的值。
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
returnMatches(a, b)
例如,将返回[5]
。
答案 0 :(得分:397)
不是最有效的方法,但到目前为止最明显的方法是:
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
{5}
如果订单很重要,你可以使用这样的列表推导来做到这一点:
>>> [i for i, j in zip(a, b) if i == j]
[5]
(仅适用于大小相同的列表,其中含义 - 意味着)。
答案 1 :(得分:337)
使用set.intersection(),它快速且易读。
>>> set(a).intersection(b)
set([5])
答案 2 :(得分:88)
快速性能测试显示Lutz的解决方案是最好的:
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
显然,任何人为的性能测试都应该花一点时间,但由于set().intersection()
答案至少和其他解决方案一样快,而且最易读,它应该是这个常见问题的标准解决方案。
答案 3 :(得分:56)
我更喜欢基于集合的答案,但这里的答案仍然适用
[x for x in a if x in b]
答案 4 :(得分:12)
最简单的方法是使用sets:
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
set([5])
答案 5 :(得分:12)
>>> 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'])**
答案 6 :(得分:11)
快捷方式:
list(set(a).intersection(set(b)))
答案 7 :(得分:9)
您也可以通过将新元素保存在新列表中来尝试此操作。
new_list = []
for element in a:
if element in b:
new_list.append(element)
答案 8 :(得分:5)
你想要重复吗?如果没有,也许你应该使用套装:
>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5]))
set([5])
答案 9 :(得分:4)
您可以使用:
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])
答案 10 :(得分:4)
另一种更有用的方法来检查列表1(lst1)和列表2(lst2)的列表相等性,其中对象具有深度1并且保持顺序为:
all(i == j for i, j in zip(lst1, lst2))
答案 11 :(得分:4)
也可以使用itertools.product。
>>> common_elements=[]
>>> for i in list(itertools.product(a,b)):
... if i[0] == i[1]:
... common_elements.append(i[0])
答案 12 :(得分:4)
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
答案 13 :(得分:3)
您可以使用
def returnMatches(a,b):
return list(set(a) & set(b))
答案 14 :(得分:2)
如果你想要一个布尔值:
>>> 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
答案 15 :(得分:1)
以下解决方案适用于列表项的任何顺序,并且还支持两个列表的长度不同。
import numpy as np
def getMatches(a, b):
matches = []
unique_a = np.unique(a)
unique_b = np.unique(b)
for a in unique_a:
for b in unique_b:
if a == b:
matches.append(a)
return matches
print(getMatches([1, 2, 3, 4, 5], [9, 8, 7, 6, 5, 9])) # displays [5]
print(getMatches([1, 2, 3], [3, 4, 5, 1])) # displays [1, 3]
答案 16 :(得分:0)
使用__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])
>>>
答案 17 :(得分:0)
you can | for set union and & for set intersection.
for example:
set1={1,2,3}
set2={3,4,5}
print(set1&set2)
output=3
set1={1,2,3}
set2={3,4,5}
print(set1|set2)
output=1,2,3,4,5
curly braces in the answer.
答案 18 :(得分:0)
我只使用了以下内容,对我有用:
group1 = [1, 2, 3, 4, 5]
group2 = [9, 8, 7, 6, 5]
for k in group1:
for v in group2:
if k == v:
print(k)
这将在您的情况下打印5。不过,可能不是明智的表现。