让我们说一些变量可以采用预设值:
var1 = [1,2,3]
var2 = [10,20,30]
我可以像这样对所有循环进行硬编码:
for var1 in [1,2,3]:
for var2 in [10,20,30]:
do something with var1 and var2
如果我想预先指定变量和值,该怎么办?如果我有一个字典来存储要遍历的变量和值:
variables2loop = {'var1' : [1,2,3],
'var2' : [10,20,30]}
我尝试过:
for var in variables2loop.keys():
for value in variables2loop[var]:
locals()[var] = value
do something with var1 and var2
但是,这并没有完成所有组合,而且也无法正常工作。在执行命令之前,它会遍历每个变量的所有值。
如果我想动态更改将在脚本中使用的变量和值,如何实现这样的for循环?
答案 0 :(得分:2)
如果您想要的是硬编码循环,
for var1 in [1,2,3]:
for var2 in [10,20,30]:
do something with var1 and var2
然后给出
var1 = [1,2,3]
var2 = [10,20,30]
您可以通过
完成相同操作for v1 in var1:
for v2 in var2:
do something with v1 and v2
代替给出
variables2loop = {'var1' : [1,2,3],
'var2' : [10,20,30]}
对
进行相同操作for v1 in variables2loop['var1']:
for v2 in variables2loop['var2']:
do something with v1 and v2
甚至
from itertools import product
for v in product(*variables2loop.values()):
do something with v[0] and v[1], etc.
即使您更改了存储在dict中的变量数,最后一个也可以使用,但是它确实假定dict是有序的,因此在旧版本的Python上不起作用。您可以简单地使用列表来代替。
var = [
[1,2,3],
[10,20,30],
]
for v in product(*var):
do something with v[0] and v[1], etc.
# similarly
for v0 in var[0]:
for v1 in var[1]:
do something with v0 and v1
答案 1 :(得分:1)
首先,我们需要解决密钥排序问题。仅保证常规dict从Python 3.7开始订购(从技术上来说,它们已经在Python 3.6中使用,但这只是实现细节,而不是语言规范的一部分)。因此,如果您不想将自己限制在3.7+以上,则应明确处理该顺序:
order = ['var1', 'var2', ..., 'varn']
variables2loop = {
'var1' : [1,2,3],
'var2' : [10,20,30],
...,
'varn': [...]
}
ordered_values = map(variables2loop.get, order)
然后是迭代过程。有序序列上的嵌套循环仅是笛卡尔积:
from itertools import product
for v1, v2, ..., vn in product(*ordered_values):
pass
最后,如果您想摆脱for
循环中的硬编码变量分配,则必须使用以下功能:
from itertools import starmap
def function(*args):
# do something with args
...
result = starmap(function, product(*ordered_values))