我有一种算法,其功能取决于两个列表之间匹配实例(甚至重复)的数量。例如:

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']

10-07 20:37