如何以Pythonic方式生成组内code的两两组合?
Pythonic方式实现分组内的两两组合生成
核心思路
先按group对原始数据归类,把同一组的code集中到一个列表里,再对每个组内的code用itertools.combinations生成所有不重复的两两组合,最后将组名与组合结果拼接,就能完全避免跨组匹配。
代码实现
方式一:普通字典分组(无额外依赖)
from itertools import combinations # 原始数据(元组列表形式,也可以换成列表字典) original_data = [ ("A", 1), ("A", 2), ("A", 3), ("B", 4), ("B", 5), ("B", 6), ("B", 7) ] # 按group分组收集code grouped_codes = {} for group, code in original_data: if group not in grouped_codes: grouped_codes[group] = [] grouped_codes[group].append(code) # 生成组内两两组合 result = [] for group, codes in grouped_codes.items(): # 生成所有2元素的不重复组合 for code1, code2 in combinations(codes, 2): result.append((group, code1, code2))
方式二:用collections.defaultdict简化(更简洁)
from itertools import combinations from collections import defaultdict original_data = [ ("A", 1), ("A", 2), ("A", 3), ("B", 4), ("B", 5), ("B", 6), ("B", 7) ] # 自动完成分组 grouped = defaultdict(list) for g, c in original_data: grouped[g].append(c) # 列表推导式一行生成结果 result = [(g, c1, c2) for g, codes in grouped.items() for c1, c2 in combinations(codes, 2)]
最终结果
将result转换成表格形式如下:
| group | code | code |
|---|---|---|
| A | 1 | 2 |
| A | 1 | 3 |
| A | 2 | 3 |
| B | 4 | 5 |
| B | 4 | 6 |
| B | 4 | 7 |
| B | 5 | 6 |
| B | 5 | 7 |
| B | 6 | 7 |
内容的提问来源于stack exchange,提问作者carljongcarljong
相关产品推荐
相关产品推荐

