我有一种算法,其功能取决于两个列表之间匹配实例(甚至重复)的数量。例如:
a = ["test", "win", "win", "bike", "bike", "bike", "gem", "nine"]
b = ["test", "win", "let", "bike", "four"]
d = set(a).intersection(b)
会给我的:
{"test", "win", "bike"}
我想要的输出将是:
{"test", "win", "win", "bike", "bike", "bike"}
我想我可以利用输出列表并计算每个相交词在
list a
中存在多少次,等等。但是,这是很多额外的步骤,我希望有一种更简单的方法可以实现此目的输出。我的问题是,根据提供的示例列表,如何实现以下目标的所需第二个输出:
{"test", "win", "win", "bike", "bike", "bike"}
最佳答案
您可以使用collections.Counter
来获取每个不同项目的计数,并使用Counter.elements
方法来生成所需的列表,并在通过b
中的成员资格对其进行过滤之后将根据计数重复的项目进行重复(将b
转换为集合有效的会员查找):
from collections import Counter
set_b = set(b)
print(list(Counter({k: c for k, c in Counter(a).items() if k in set_b}).elements()))
输出:
['test', 'win', 'win', 'bike', 'bike', 'bike']