首先,我是编程和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
有谁能建议解决这个问题?任何帮助,将不胜感激!
谢谢,
亚当
列表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)
使用集合的麻烦在于集合没有重复项。实际上,使用集合的通常原因是消除重复。当然,这就是您所不需要的。
你是因为你使用发现这个问题集为您集合类型.集合有两个特征:它们是无序的(这在这里无关紧要),它们的元素是唯一的.因此,在将它们转换为集合之前,您甚至会丢失列表中的重复项,甚至在找到它们的交集之前:
>>> 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,并list2到results2.
如果您需要的信息不仅仅是重复数量,那么您将需要使用字典,或者更好的是,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)