您看到此问题是因为您使用集合作为集合类型。集合有两个特征:它们是无序的(在这里无关紧要),并且它们的元素是唯一的。因此,当您将它们转换为集合时,您甚至会在找到它们的交集之前丢失列表中的重复项:
>>> p = ['1', '2', '3', '3', '3', '3', '3']
>>> set(p)
set(['1', '2', '3'])
您可以通过多种方式在此处执行您想要执行的操作,但您需要从查看 listcount
方法开始。我会做这样的事情:
>>> 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}
这种方法创建一个字典 ( 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
这与我的第一个建议类似:它遍历主列表中的每个单词(这里我使用words
),将它出现的次数添加list1
到 counterresults1
和list2
to results2
。
如果您需要的信息不仅仅是重复的数量,您将需要使用字典,或者更好的是模块Counter
中的专用类型。collections
Counter 旨在使我在上面的示例中所做的一切变得容易。
>>> 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