如何高效生成含d个±val非零元素的r元组?
解决方案
可以用itertools里的两个工具来简化实现,不管d取多大都能轻松处理:
combinations:用来从r个位置中选出d个不重复的位置索引product:用来生成这d个位置对应的所有±val组合
完整代码示例
import itertools val = 7 r = 5 d = 2 # 这里可以改成任意正整数,只要d ≤ r for positions in itertools.combinations(range(r), d): # 生成d个位置对应的所有取值组合(每个位置有+val/-val两种选择) for values in itertools.product([val, -val], repeat=d): t = [0] * r # 给选中的位置赋值 for pos, v in zip(positions, values): t[pos] = v print(t)
代码说明
- 选位置:
itertools.combinations(range(r), d)会生成所有长度为d的不重复索引组合,比如r=5、d=2时,会得到(0,1)、(0,2)、(0,3)、(0,4)、(1,2)...这些位置对,和你原来代码里的i0、i1循环逻辑一致,但更通用。 - 生成取值组合:
itertools.product([val, -val], repeat=d)会生成d个元素的笛卡尔积,每个元素是val或-val,比如d=2时就是(7,7)、(7,-7)、(-7,7)、(-7,-7),对应你原来的v0、v1循环。 - 构造元组/列表:先创建全0列表,再把每个选中的位置对应的值填进去,最后输出。
这个方法完全不需要嵌套多层循环,不管d是3、4还是其他值,只要调整d参数就能直接运行,扩展性极强。
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

