2009-09-07 79 views

回答

289

不是最有效的,但目前为止最明显的方式做到这一点是:

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

如果顺序显著你可以用列表理解这样做(只适用于大小相同的列表,这些顺序意义暗示着)。

+5

一个值得注意的问题,列表理解是*不*一定是更快的选择。对于更大的集合(性能最有可能成立),按比较('&')或'set(a).intersection(b)'将比列表理解更快或更快。 – Joshmaker 2012-06-03 17:00:22

+5

另一个值得注意的事项是:列表理解找到两个同样位置出现的值(这是SilentGhost意思是“顺序很重要”)。设定的路口解决方案也会在不同的位置找到匹配。这些是对两个完全不同的问题的回答......(op的问题与它所要求的模糊不清) – drevicko 2013-11-24 22:58:01

+0

如果你的列表是列表列表,即a = [[0,0],[1, 0]]和b = [[2,3],[0,0]] – Schneems 2017-03-12 21:18:24

11

做到这一点的最简单的方法是使用sets

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

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

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

此答案具有良好的算法性能,因为只有其中一个列表(应该是首选的较短)被转换为快速查找的集合,而另一个列表则遍历查找集合中的项目。 – u0b34a0f6ae 2009-09-07 12:08:11

+3

'bool(set(a).intersection(b))''True'或'False' – Akshay 2017-10-20 03:20:16

+0

由于人们可能需要['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

5

你要重复?如果没有,也许你应该使用组,而不是:


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

如果您确实需要列表,请将相交([1,2,3,4,5],[9,8,..., 7,6,5]) [5] – 2009-09-07 11:16:59

+0

根据文档 - * ...排除像Set('abc')&'cbs'这样容易出错的构造,使其更易读Set('abc')。交叉点('cbs')。* - http://docs.python.org/library/sets.html – 2012-05-31 13:40:47

3

您可以使用

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

接受的答案对包含字符串的列表无效。这个呢。 – Antony 2018-01-25 16:18:05

8

而且你可以通过在一个新列表中保存常用元素来尝试这一点。

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

显示卢茨的解决方案快速的性能测试是最好的:

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乐,它应该是这个常见问题的标准解决方案。

1

您可以使用:

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]) 
+3

这与6年前的接受答案有何不同? – tom 2016-01-06 11:12:28

+1

那么,我写了输出的完整细节和良好的初学者python – 2016-01-06 13:10:58

1

另一个更实用一点的方法来检查清单1(LST1)和表2(LST2)名单平等,其中的对象具有深度一个和它保持的顺序是:

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

也可以使用itertools.product。

>>> common_elements=[] 
>>> for i in list(itertools.product(a,b)): 
... if i[0] == i[1]: 
...  common_elements.append(i[0]) 
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 
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]) 
>>>  
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

虽然这段代码可能回答这个问题,提供额外的上下文关于如何和/或为什么它解决问题将提高答案的长期价值。 – 2017-07-20 00:45:57

相关问题