繁体   English   中英

使用Python 2比较2个列表的所有元素

[英]Comparing all elements of 2 lists with Python 2

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

我知道我可以写出很多if语句,但是我希望有一种更优雅的方法。

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

编辑:这不是重复项,b / ci将两个不同的列表相互比较,而可能的重复项仅处理了一个列表。

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

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

from collections import Counter
counts = Counter(b)

for i in a:
    print(i, counts[i])

如果仅关注共享值,而不关注它们的位置或计数,请将其转换为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的解决方案不同,因为它是对称的,即,如果在列表a存在5 a ,在列表b ,则共享计数将为1 ,而不是2

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]

如果使用大数组,则内存可能会很复杂,但是如果您打算使用此数据,那为什么不呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM