如何在Python中比较两个列表并返回匹配项

530

我想要取两个列表中共同出现的值。

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

returnMatches(a, b)

比如说,会返回[5]


7
以下所有回答都对我来说似乎是错误的。如果一个数字在任何一个列表中重复了,那么会发生什么,你肯定想知道这一点吧?(例如,假设两个列表都有两个'5')。使用集合的任何解决方案都会立即删除所有重复项,这样你就会失去那些信息。 - M.H.
这个问题被解释成了两种不同的方式。如果目标是找到两个列表中所有共同的元素(无论它们在列表中出现的位置如何),那么这就是一个列表交集。否则,如果目标是比较对应位置上的每一对元素,那么我们只需逐对迭代并检查每一对即可。无论哪种方式,都有更好的版本的问题,所以我用两个不同的重复链接关闭了它。 - Karl Knechtel
如果想要返回不在另一个数据框中的列(也适用于列表),可以使用numpy解决方案,这里是jezrael的答案。https://dev59.com/W6Dia4cB1Zd3GeqPCFi3#43029056 - DOT
21个回答

6

也可以使用itertools.product。

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

5

找到共同值的另一种方法:

a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
matches = [i for i in a if i in b]

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

4
这与6年前被接受的答案有何不同? - tmdavison
1
好的,我写了完整的细节和输出,适合初学者使用的Python。 - Adnan Ghaffar

4
你可以使用

标签


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

3
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 

1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Donald Duck

3
如果你想要一个布尔值:
>>> 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

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]

1
Numpy有一个特定的函数:np.intersect1d(list1, list2) - obchardon

1
使用__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])
>>>    

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。但从性能方面来看可能不是很好。


0

这是给那些想要返回特定字符串或输出的人,以下是代码,希望能帮到你:

lis =[]
#convert to list
a = list(data)
b = list(data)
def make_list():
    c = "greater than"
    d = "less_than"
    e = "equal"
    for first, first_te in zip(a, b):
        if first < first_te:
            lis.append(d)
        elif first > first_te:
            lis.append(c)
        else:
            lis.append(e)
    return lis

make_list()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接