Python 3 - 计算两个列表中的匹配项(包括重复项)

Ada*_*mic 5 python python-3.x

首先,我是编程和python的新手,我看过这里但找不到解决方案,如果这是一个愚蠢的问题,请原谅我!

我有两个列表,我正在尝试确定第二个列表中的项目出现在第一个列表中的次数.

我有以下解决方案:

    list1 = ['black','red','yellow']
    list2 = ['the','big','black','dog']
    list3 = ['the','black','black','dog']
    p = set(list1)&set(list2)
    print(len(p))
Run Code Online (Sandbox Code Playgroud)

除了第二个列表包含重复项之外,它工作正常.

即上面的list1和list2返回1,但list1和list3也是如此,理想情况下应该返回2

有谁能建议解决这个问题?任何帮助,将不胜感激!

谢谢,

亚当

sau*_*atz 5

列表1和列表2不应返回0吗?还是你的意思是

list1 = ['black', 'red', 'yellow']
Run Code Online (Sandbox Code Playgroud)

我想您想要的是

print(len([w for w in list2 if w in list1]))
Run Code Online (Sandbox Code Playgroud)

使用集合的麻烦在于集合没有重复项。实际上,使用集合的通常原因是消除重复。当然,这就是您所不需要的。


tox*_*tes 5

你是因为你使用发现这个问题为您集合类型.集合有两个特征:它们是无序的(这在这里无关紧要),它们的元素是唯一的.因此,在将它们转换为集合之前,您甚至会丢失列表中的重复项,甚至在找到它们的交集之前:

>>> p = ['1', '2', '3', '3', '3', '3', '3']
>>> set(p)
set(['1', '2', '3'])
Run Code Online (Sandbox Code Playgroud)

您可以通过多种方式执行此处要执行的操作,但您需要先查看list count方法.我会做这样的事情:

>>> list1 = ['a', 'b', 'c']
>>> list2 = ['a', 'b', 'c', 'c', 'c']
>>> results = {}
>>> for i in list1:
        results[i] = list2.count(i) 
>>> results
{'a': 1, 'c': 3, 'b': 1}
Run Code Online (Sandbox Code Playgroud)

此方法创建一个dictionary(results),并为其中的每个元素list1创建一个键results,计算它发生的次数list2,并将其分配给键的值.

编辑:正如Lattyware所指出的那样,这种方法解决的问题与您提出的问题略有不同.一个真正根本的解决方案看起来像这样

>>> words = ['red', 'blue', 'yellow', 'black']
>>> list1 = ['the', 'black', 'dog']
>>> list2 = ['the', 'blue', 'blue', 'dog']
>>> results1 = 0
>>> results2 = 0
>>> for w in words:
        results1 += list1.count(w)
        results2 += list2.count(w)

>>> results1
1
>>> results2
2
Run Code Online (Sandbox Code Playgroud)

此作品以类似的方式,以我的第一个建议:通过每个字在你的主目录遍历(这里我用words),加上它出现在的次数list1柜台results1,并list2results2.

如果您需要的信息不仅仅是重复数量,那么您将需要使用字典,或者更好的是,Counter使用collections模块中的专用类型.计数器旨在使我在上面的示例中所做的一切变得简单.

>>> from collections import Counter
>>> results3 = Counter()
>>> for w in words:
        results3[w] = list2.count(w)

>>> results3
Counter({'blue': 2, 'black': 0, 'yellow': 0, 'red': 0})
>>> sum(results3.values())
2
Run Code Online (Sandbox Code Playgroud)