列出多个匹配实例的交集

List intersection for multiple matching instances

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

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"}

你应该使用列表而不是集合,你可以利用你已经定义的代码,所以:

a = ["test", "win", "win", "bike", "bike", "bike", "gem", "nine"]
b = ["test", "win", "let", "bike", "four"]

s = set(a).intersection(b)

output = []

for e in s:
    n = max(a.count(e), b.count(e))
    output.extend([e] * n)

>>> output
['win', 'win', 'bike', 'bike', 'bike', 'test']

基本上,您正在做的是重复公共元素,考虑它在哪个列表中重复最多。

您可以使用 collections.Counter 获取每个不同项目的计数,并使用 Counter.elements 方法生成所需的列表,其中项目在按 [= 中的成员资格过滤后根据计数重复14=](将 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']