python-3.x - 如何减少编号。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
等等..有很多行,但显示前几行。
解决方案
您可以使用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
,所以i
是I[0]
,j
是I[1]
,......等等。
推荐阅读
- python - glmnet Python 库加载问题
- android - 如何使用 MediaSession 将音频元数据传递给 MediaBrowserService
- google-apps-script - 通过使用应用程序脚本在电子邮件中包含表单选项通过电子邮件发送 Google 表单
- html - 双滚动捕捉镀铬错误
- sql - 连接 2 个未连接的表,但通过多对多关系连接到同一个表
- javascript - 配置列表表单以根据 Sharepoint Online 中的 CurrentUser.email 值隐藏列
- r - 绘制神经网络的结构
- django - 如何在代码块之后插入段落
在夏日笔记中
- python - 我不知道什么时候必须使用 centerx 和 centry
- swift - 将 didSet 与元组一起使用?