首页 > 解决方案 > 如何减少编号。python代码中的for循环

问题描述

我想生成一个 csv 文件,其中包含以下格式的行。列数是动态的,它可能会随着变量“n”的值而变化。因此,如果我们有 n=3 将有 3 列:第一行在第一行的每个单元格中初始化为 1/3 值,如下 0.333 0.333 0.333 类似如果 n=6,将有 6 列和第一行在第一行的每个单元格中用 1/6 值初始化。0.166667 0.166667 0.166667 0.166667 0.166667 0.166667

每行中所有元素的总和必须等于 1。

没有限制。的行。我们只担心元素的总和应该等于 1。下表是我的代码生成的 csv 文件的前几行的集合:

0.166667 0.166667 0.166667 0.166667 0.166667 0.166667 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0.166667 0.833333 0 0 0 0 0.333333 0.666667 0 0 0 0 0.5 0.5 0 0 0 0 0.666667 0.333333

我是编程新手,我认为我的逻辑效率不高。我正在尝试找出一种方法来减少我在下面的代码中使用的 for 循环的数量。如果 n 的值增加,则没有。如果我们按照我的逻辑,for 循环的数量也会增加。请帮我。

import csv
n = 6 #This variable is controlled by other factors and may change
f = [0, 1]

for i in range(1, n):
    j = float(i) / float(n)
    f.append(j)

# Generate WS
initial = float(1) / float(n)
w = []
for i in range(n):
    w.append(initial)
ws = [w]
for i in f:
    for j in f:
        for k in f:
            for l in f:
                for m in f:
                    for o in f:
                        if (i + j + k + l + m + o == 1):
                            w = [i, j, k, l, m, o]
                            ws.append(w)
with open('weight.csv', 'w') as cfile:
    cwrite = csv.writer(cfile)
    cwrite.writerows(ws)

预期的csv:

0.166666667 0.166666667 0.166666667 0.166666667 0.166666667 0.166666667

0 0 0 0 0 1

0 0 0 0 1 0

0 0 0 0 0.166666667 0.833333333

0 0 0 0 0.333333333 0.666666667

0 0 0 0 0.5 0.5

0 0 0 0 0.666666667 0.333333333

0 0 0 0 0.833333333 0.166666667

0 0 0 1 0 0

0 0 0 0.166666667 0 0.833333333

等等..有很多行,但显示前几行。

标签: python-3.xcsvfor-loop

解决方案


您可以使用itertools.product

from itertools import product

n = 6 # or whatever number >= 1

for I in product(*[f] * n):
    if sum(I) == 1:
        ws.append(list(I))

然后你可以i, j, k, ...通过索引提取你的I,所以iI[0]jI[1],......等等。


推荐阅读