Python高效生成列表符合分组规则无重复组名组合的实现方法
高效筛选分组元素组合方案
原有代码的性能问题
原有实现性能差的核心原因是未利用已知的分组规则,先全量枚举所有元素组合再做校验,组合数随分组数x、每组元素数y的增长呈指数级暴涨,且校验逻辑存在大量冗余计算。
优化方案
由于要求每个组合中各分组仅出现一次,直接对每个分组的元素列表做笛卡尔积即可,生成的结果天然符合要求,无需额外校验。
场景1:已持有分组名、后缀值两套独立数据
直接生成各分组的元素列表,再做笛卡尔积即可:
import itertools # 你的原始分组、后缀数据 gr_list = ['ST1', 'ST2', 'ST3'] suf_list = ['0.245', '0.29', '0.335'] # 生成每个分组对应的所有元素 group_elements = [[f"{g}_{s}" for s in suf_list] for g in gr_list] # 笛卡尔积直接得到所有符合要求的组合 comb = list(itertools.product(*group_elements))
场景2:仅持有拼接后的元素列表A
先按前缀完成分组,再做笛卡尔积:
from collections import defaultdict import itertools A = ['ST1_0.245', 'ST1_0.29', 'ST1_0.335', 'ST2_0.245', 'ST2_0.29', 'ST2_0.335', 'ST3_0.245', 'ST3_0.29', 'ST3_0.335'] # 按前缀分组 group_map = defaultdict(list) for item in A: prefix = item.split('_')[0] group_map[prefix].append(item) # 按分组顺序取元素列表做笛卡尔积 group_elements = list(group_map.values()) comb = list(itertools.product(*group_elements))
性能对比
以x=10、y=5为例,原有实现需要枚举C(50,10)≈102亿次组合,优化后仅需要计算5^10=976万次,性能提升超过1000倍,数据量越大提升效果越显著。
内容的提问来源于stack exchange,提问作者casducks
相关产品推荐
相关产品推荐

