python - for循环的自动化,以覆盖dict中任意数量的键

时间:2018-05-09 20:45:24

标签: python

所以我需要查看一些函数f,它取决于各种参数,汇总在我称为dict的{​​{1}}中。

data中的某些参数已修复,如data,而其他我想改变。

我在data['focus'],另一个temp中写下了我想要更改的参数。我的函数dict然后获取变化参数的所有组合并每次计算Trial,将其结果和参数保存到f dict dicts,其中每个计算都保存在calcdata

我在下面提供了一个最小的工作示例。 这有效,我已经可以使用它了(虽然我简化了函数calcdata[counter])。
但是,正如您所看到的,我仅限于3组参数。

我有没有办法让它可以在f中接受任意数量的keys
基本上我想要某种自动化,这样我就不必写tempvalue0
理想情况下,它会读出有多少keys[0],并执行所需的keys次循环。

for

2 个答案:

答案 0 :(得分:1)

以下是您可以使用的一般想法:

from itertools import product

temp = {'integration': [1, 2], 'upper': [3, 4], 'other': [5, 6]}
keys = list(temp.keys())
data = {}
for values in product(*temp.values()):
    data.update(zip(keys, values))
    print(data)

(由于对键和值的单独访问,这在temp上不是线程安全的)

答案 1 :(得分:0)

itertools.product为您提供所需的组合。问题是您需要从结果中重建字典。在此示例中,我将temp扩展为(key, value)元组,可用于更新data字典。我复制data,这样我就不必担心每个循环上的陈旧数据了。

我将这个作为一个可运行的python 2脚本,带有额外的打印以显示中间步骤。

import numpy as np
import itertools

def f(data, t):
    x = data['focus']*data['integration']*data['upper']
    return t*x

def Trial(t, temp, data):

    calcdata = {}

    # make list of (key:value) pairs for each value list
    temp_vector = [[(key, value) for value in valuelist]
        for key,valuelist in temp.iteritems()]
    print "temp_vector"
    for item in temp_vector:
        print item
    print "-------------------------------"

    # run for all combinations
    for counter, subs in enumerate(itertools.product(*temp_vector)):
        mydata = data.copy()
        mydata.update(subs)
        print "dict for calcuation:", mydata
        x_axis, y_axis = np.vstack((t,np.vectorize(f)(mydata,t)))
        mydata['xaxis'] = x_axis
        mydata['yaxis'] = y_axis
        calcdata[counter] = mydata 

    print "--------------------------------"
    return calcdata

#data['focus'] = 100
data = {'focus':100}
t = np.linspace(1,10,10)
temp = {'integration': [1,2], 'upper':  [3,4], 'other':  [5,6]}

calcdata = Trial(t, temp, data)

for item in sorted(calcdata.items()):
    print(item)