如何优雅实现保留重复元素的集合交集?
实现带重复项的集合交集
首先要明确:Python内置的set是无序且自动去重的,你示例里的s1 = {1, 1, 2, 3}实际会被解析为{1, 2, 3},丢失了重复元素,这也是intersection()只返回{1}的原因。要实现保留重复项的交集,你需要先改用可存储重复元素的容器(比如列表),再用collections.Counter处理,这是最优雅的方案:
代码实现
from collections import Counter # 用列表存储带重复的元素,避免自动去重 s1 = [1, 1, 2, 3] s2 = [4, 5, 1, 1] # 取两个Counter的交集:保留共同元素,计数取两者的最小值 common_counts = Counter(s1) & Counter(s2) # 展开为包含所有重复项的结果列表 result = list(common_counts.elements()) print(result) # 输出: [1, 1]
关键逻辑说明
Counter会统计每个元素的出现次数:Counter(s1)得到Counter({1:2, 2:1, 3:1}),Counter(s2)得到Counter({1:2, 4:1, 5:1})Counter的&操作符会生成新的Counter,仅包含两个Counter共有的元素,且每个元素的计数取两者中的较小值,这里得到Counter({1:2})common_counts.elements()会返回迭代器,按计数重复输出元素,转成列表后就是你需要的带重复项的交集结果。
注意:Python中不存在允许重复元素的set类型,你想要的{1, 1}在语法上是无效的(实际会被自动去重为{1}),所以用列表存储最终结果是合理的选择。
内容的提问来源于stack exchange,提问作者stas_provotorov
相关产品推荐
相关产品推荐

