列出多个匹配实例的交集
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']
我有一个算法,其功能取决于两个列表之间匹配实例(甚至重复)的数量。例如:
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']