如何循环存储在python字典中的变量名和值?

时间:2019-01-21 21:04:27

标签: python

让我们说一些变量可以采用预设值:

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循环?

2 个答案:

答案 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))