将 2 个列表的所有元素与 Python 进行比较 2

Comparing all elements of 2 lists with Python 2

我有 2 个列表:a = ['5', '2', '3', '4']b = ['1', '6', '7', '5']。使用 Python 2,如何将 a 中的每个列表元素与 b 中的每个元素进行比较? (即 a[0] == b[0]a[0] == b[1] 等)。

我知道我可以写出许多 if 语句,但我希望有更优雅的方法来做到这一点。

检查每个列表元素后,我想知道找到共享值的次数(在我上面的示例列表中,应该是一次,'5')。

编辑:这不是重复的,b/c我正在相互比较两个不同的列表,而可能的重复只处理了 1 个列表。

listcount() 方法可能有帮助:

>>> a = ['5', '2', '3', '4']
>>> b = ['1', '6', '7', '5']
>>> for item in a:
...     print item, b.count(item)
... 
5 1
2 0
3 0
4 0

如果您只关心共享值,而不关心它们的位置或计数,请将它们转换为 set 并使用 intersection:

>>> a = ['5','2','3','4']
>>> b = ['1','6','7','5']
>>> set(a).intersection(b)
{'5'}

如果想保留元素在交集出现的频率,也可以使用&

collections.Counter进行交集
>>> a = ['5','2','3','4','1','1','6','5']
>>> b = ['1','6','7','5','5']
>>> collections.Counter(a) & collections.Counter(b)
Counter({'5': 2, '1': 1, '6': 1})

注意:这与@GingerPlusPlus 的解决方案不同,因为它是对称的,即如果 5 在列表 a 中出现一次,在列表 b 中出现两次,则共享计数将是 1,而不是 2

大输入可能比 更快,因为它只需要迭代 b 一次,
而不是 len(a) 次:

from collections import Counter
counts = Counter(b)

for i in a:
    print(i, counts[i])
def cmp(*lists):
    lists_len_min = list(map(lambda x: len(x), lists))
    if min(lists_len_min) != max(lists_len_min):
        raise Exception("Lists must have equal length")
    iterator = iter(lists)
    last = next(iterator)
    for element in iterator:
        for i, each in enumerate(element):
            #print(i, last[i], each)
            if last[i] != each:
                return False
    else:
        return True

这个函数可以比较任意数量的等长列表。只需调用 cmp(list1, list2, list3)

此代码将生成包含在 ab 列表中的元素列表

a = [1,2,3,4]
b = [2,3,1,7]
c = [e for e in a if e in b]

如果你使用大数组,内存可能会很复杂,但如果你打算使用这些数据,为什么不呢