Python循环生成类别三元组合包 避免顺序不同的重复结果问题
生成符合要求的三元组合包解决方案
原代码问题分析
- 逻辑判断不完整:仅限制了相邻循环变量不等,既没有排除
(c1,c1,c1)这类三个元素完全重复的情况,也没有限制元素顺序,会生成大量元素相同但排序不同的重复组合 - 语法错误:
bundling_list.append(bundling)写在了if c != y:的判断分支外,即使c == y未触发bundling赋值,也会强行追加变量,导致出现重复或异常值
最优实现方案
Python标准库itertools的combinations_with_replacement方法天生满足「元素相同顺序不同视为同一组合、允许重复元素」的需求,只需额外过滤掉三个元素完全相同的情况即可:
import itertools list_category = ['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10'] bundling_list = [] # 生成所有不考虑顺序、允许元素重复的三元组合 for combo in itertools.combinations_with_replacement(list_category, 3): # 过滤掉三个元素完全相同的情况 if not (combo[0] == combo[1] == combo[2]): # 转成横杠连接的字符串格式 bundling_list.append('-'.join(combo)) print(bundling_list)
手动循环实现(不依赖标准库以外的工具)
如果要手动写三层循环实现,可以限制每次循环的起始索引大于等于上一层的索引,从根源避免生成顺序不同的重复组合:
list_category = ['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10'] n = len(list_category) bundling_list = [] for i in range(n): for j in range(i, n): for k in range(j, n): # 排除三个元素完全相同的情况 if not (i == j == k): bundling = f"{list_category[i]}-{list_category[j]}-{list_category[k]}" bundling_list.append(bundling) print(bundling_list)
内容的提问来源于stack exchange,提问作者arze
相关产品推荐
相关产品推荐

