从含重复元素的列表中提取指定长度的唯一组合及剩余元素
解决有重复元素列表的指定长度唯一组合及剩余元素提取问题
问题原因说明
你直接用itertools.combinations不符合需求是因为该方法是基于元素的位置生成组合的,当原列表存在重复值时,会生成大量内容完全相同的重复组合。比如示例列表中的两个1,分别和2组合会得到两个完全一致的(1,2),不符合「每个组合仅出现一次」的要求。
实现代码
from itertools import combinations from collections import Counter def get_unique_combs_and_remainder(raw_list, comb_length): # 生成所有组合后去重,过滤重复内容的组合 unique_combs = list(set(combinations(raw_list, comb_length))) # 若需要组合按升序排列,可替换为下行代码 # unique_combs = sorted(set(combinations(raw_list, comb_length))) result = [] raw_count = Counter(raw_list) for comb in unique_combs: # 基于计数差值计算剩余元素 remain_count = raw_count - Counter(comb) remain_list = [] for item, cnt in remain_count.items(): remain_list.extend([item]*cnt) result.append([comb, remain_list]) return result
调用示例
a = [1, 1, 2, 3, 4, 4, 5, 5] # 提取长度为2的唯一组合及剩余元素 output = get_unique_combs_and_remainder(a, 2) print(output)
输出片段示例
[[(1, 2), [1, 3, 4, 4, 5, 5]], [(1, 3), [1, 2, 4, 4, 5, 5]], [(2, 5), [1, 1, 3, 4, 4, 5]], ...]
完全符合你要求的输出格式。
内容的提问来源于stack exchange,提问作者Rajeev Modak
相关产品推荐
相关产品推荐

