我想采用两个列表并查找两个列表中出现的值。如何比较python中的两个列表并返回匹配结果
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
returnMatches(a, b)
例如将返回[5]
。
我想采用两个列表并查找两个列表中出现的值。如何比较python中的两个列表并返回匹配结果
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
returnMatches(a, b)
例如将返回[5]
。
不是最有效的,但目前为止最明显的方式做到这一点是:
>>> [i for i, j in zip(a, b) if i == j]
[5]
:
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
{5}
如果顺序显著你可以用列表理解这样做(只适用于大小相同的列表,这些顺序意义暗示着)。
做到这一点的最简单的方法是使用sets:
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
set([5])
使用set.intersection(),它的快速性和可读性。
>>> set(a).intersection(b)
set([5])
此答案具有良好的算法性能,因为只有其中一个列表(应该是首选的较短)被转换为快速查找的集合,而另一个列表则遍历查找集合中的项目。 – u0b34a0f6ae 2009-09-07 12:08:11
'bool(set(a).intersection(b))''True'或'False' – Akshay 2017-10-20 03:20:16
由于人们可能需要['difference'](https://docs.python。 org/3/library/stdtypes.html#frozenset.difference)或['union'](https://docs.python.org/3/library/stdtypes.html#frozenset.union)。 – 2017-11-01 02:31:15
快速路:
list(set(a).intersection(set(b)))
你要重复?如果没有,也许你应该使用组,而不是:
>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5]))
set([5])
如果您确实需要列表,请将相交([1,2,3,4,5],[9,8,..., 7,6,5]) [5] – 2009-09-07 11:16:59
根据文档 - * ...排除像Set('abc')&'cbs'这样容易出错的构造,使其更易读Set('abc')。交叉点('cbs')。* - http://docs.python.org/library/sets.html – 2012-05-31 13:40:47
您可以使用
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'])**
接受的答案对包含字符串的列表无效。这个呢。 – Antony 2018-01-25 16:18:05
我更喜欢基于集合的答案,但这里有一个工程反正
[x for x in a if x in b]
而且你可以通过在一个新列表中保存常用元素来尝试这一点。
new_list = []
for element in a:
if element in b:
new_list.append(element)
显示卢茨的解决方案快速的性能测试是最好的:
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()
的答案是至少与其他解决方案一样快,也是最readab乐,它应该是这个常见问题的标准解决方案。
您可以使用:
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])
这与6年前的接受答案有何不同? – tom 2016-01-06 11:12:28
那么,我写了输出的完整细节和良好的初学者python – 2016-01-06 13:10:58
另一个更实用一点的方法来检查清单1(LST1)和表2(LST2)名单平等,其中的对象具有深度一个和它保持的顺序是:
all(i == j for i, j in zip(lst1, lst2))
也可以使用itertools.product。
>>> common_elements=[]
>>> for i in list(itertools.product(a,b)):
... if i[0] == i[1]:
... common_elements.append(i[0])
如果你想有一个布尔值:
>>> 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
虽然这段代码可能回答这个问题,提供额外的上下文关于如何和/或为什么它解决问题将提高答案的长期价值。 – 2017-07-20 00:45:57
一个值得注意的问题,列表理解是*不*一定是更快的选择。对于更大的集合(性能最有可能成立),按比较('&')或'set(a).intersection(b)'将比列表理解更快或更快。 – Joshmaker 2012-06-03 17:00:22
另一个值得注意的事项是:列表理解找到两个同样位置出现的值(这是SilentGhost意思是“顺序很重要”)。设定的路口解决方案也会在不同的位置找到匹配。这些是对两个完全不同的问题的回答......(op的问题与它所要求的模糊不清) – drevicko 2013-11-24 22:58:01
如果你的列表是列表列表,即a = [[0,0],[1, 0]]和b = [[2,3],[0,0]] – Schneems 2017-03-12 21:18:24