Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何循环python中存储在字典中的变量名和值?_Python - Fatal编程技术网

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

如何循环python中存储在字典中的变量名和值?,python,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],

假设我有一些变量可以采用预先设置的值:

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
但这并不是做所有的组合,也不是工作正常。在执行dosomething命令之前,它将遍历每个变量的所有值


如果我想动态更改脚本中使用的变量和值,如何实现这样的for循环?

如果您的硬编码循环是您想要的

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
for v1 in variables2loop['var1']:
    for v2 in variables2loop['var2']:
        do something with v1 and v2
相反

variables2loop = {'var1' : [1,2,3], 
                  'var2' : [10,20,30]}
用同样的方法处理

for v1 in var1:
    for v2 in var2:
        do something with v1 and v2
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

首先,我们需要解决密钥排序问题。常规dict只能保证从python3.7开始订购(从技术上讲,它们已经在python3.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))

我不确定我是否100%理解您的问题,但从第一段代码判断,您似乎正在尝试创建笛卡尔积。对于此用途,
itertools.product
。顺便说一句,DICT仅保证以Python 3.7+或CPython 3.6订购。即使在3.7之前,您也可以使用OrderedDict,但在这种情况下,您也可以使用列表。产品(*args)中的*做什么?如果我不包括它,它似乎正常工作。如果我包括它,我会得到一个错误:
TypeError:“float”对象不可编辑
@hirshme该函数被定义为
itertools.product(*iterables,repeat=1)
:注意星号。因此,您需要解包
有序的\u值
。您得到的错误使我想到,您实际的
variables2loop
字典包含可单位化的
值(即一些变量/浮点的关键点)。