Python高效生成含1-2个±1其余为0的列表排列组合
高效实现方案
你的需求可以拆分「单非零元素」和「双非零元素」两个独立场景生成,完全避免无效遍历和去重逻辑,用itertools的组合生成能力就能写出非常简洁的代码:
import itertools slots = 12 all_choices = [] # 生成只有1个非零元素的情况 for (pos,) in itertools.combinations(range(slots), 1): for val in (1, -1): row = [0] * slots row[pos] = val all_choices.append(row) # 生成有2个非零元素的情况 for pos1, pos2 in itertools.combinations(range(slots), 2): for val1, val2 in itertools.product((1, -1), repeat=2): row = [0] * slots row[pos1] = val1 row[pos2] = val2 all_choices.append(row)
方案优势
- 无冗余计算:总生成量和最终结果数量完全一致(slots=12时总共有288个结果),不需要像第一版那样遍历3^12=531441种无效组合,也不需要像第二版那样做重复元素判断,性能提升非常明显
- 结果天然无重复:通过
combinations保证位置选择的有序性,不会生成重复的排列,省掉了额外去重的开销 - 可扩展性强:如果后续要调整非零元素数量、取值范围,只要修改对应生成逻辑即可,维护成本很低
如果追求更简洁的写法,也可以用列表推导式合并逻辑:
import itertools slots = 12 all_choices = [ [val if i == pos else 0 for i in range(slots)] for pos in range(slots) for val in (1, -1) ] + [ [val1 if i == pos1 else val2 if i == pos2 else 0 for i in range(slots)] for pos1, pos2 in itertools.combinations(range(slots), 2) for val1, val2 in itertools.product((1, -1), repeat=2) ]
内容的提问来源于stack exchange,提问作者EllipticalInitial
相关产品推荐
相关产品推荐

