如何求满足元素合并等式的含重复元素两个List的特定交集
解决特定多重集合交集问题
给定两个列表:
list1 = [1,2,3,3,3,4,4,5] list2 = [3,4,5]
需要得到集合A = [1,2,3,3,4,5],满足以下条件:
- 从多重集合角度,A的所有元素与list2的所有元素合并后,和list1的元素完全一致(即每个元素的出现次数总和相等)
len(list1) > len(list2)
解决方案
核心思路是统计每个元素在两个列表中的出现次数,对每个元素保留list1中超出list2的部分(list2中没有的元素则全部保留),最终还原为列表。
方法1:保持原列表元素顺序
from collections import Counter list1 = [1,2,3,3,3,4,4,5] list2 = [3,4,5] # 统计两个列表的元素出现次数 count1 = Counter(list1) count2 = Counter(list2) A = [] # 记录已添加到A中的元素次数 added = Counter() for num in list1: # 计算当前元素需要保留的总次数 need_keep = count1[num] - count2.get(num, 0) if added[num] < need_keep: A.append(num) added[num] += 1 print(A) # 输出: [1, 2, 3, 3, 4, 5]
方法2:快速生成(不保证顺序)
如果不需要保持原列表顺序,可以用更简洁的方式:
from collections import Counter list1 = [1,2,3,3,3,4,4,5] list2 = [3,4,5] count1 = Counter(list1) count2 = Counter(list2) # 计算每个元素在A中的出现次数 a_counter = {k: count1[k] - count2[k] for k in count1 if count1[k] > count2.get(k, 0)} # 转换为列表 A = [] for num, cnt in a_counter.items(): A.extend([num] * cnt) print(A) # 输出可能为 [1,2,3,3,4,5](顺序不固定)
逻辑说明
- 对每个元素,A中的出现次数 = list1中的出现次数 - list2中的出现次数(结果大于0时才保留)
- 合并A和list2的元素后,每个元素的总次数与list1完全一致,满足题目要求的
ALL_ELEMENTS_OF_A + ALL_ELEMENTS_OF_LIST2 = ALL_ELEMENTS_OF_LIST1(多重集合层面)
内容的提问来源于stack exchange,提问作者Ulmer
相关产品推荐
相关产品推荐

