自动执行 for 循环以覆盖字典中任意数量的键



所以我需要查看一些函数f,它取决于各种参数,总结为我称之为datadict

data中的一些参数是固定的,例如data['focus'],而其他参数则我想更改。

我在temp,另一个dict,写下我要更改的参数。然后,我的函数Trial采用不同参数的所有组合并每次计算f,将其结果和参数保存到dictscalcdatadict中,其中每个计算都保存在calcdata[counter]中。

我在下面提供了一个最小的工作示例。 这有效,我已经可以使用它(不过我已经简化了该功能f(。
但是,如您所见,我仅限于 3 个参数集。


有没有办法让它可以接受任意数量的keystemp
基本上,我想要某种自动化,这样我就不必写value0keys[0]
因此,理想情况下,它会读取有多少keys,并执行覆盖所有for循环所需的尽可能多的循环。

import numpy as np
def f(data, t):
x = data['focus']*data['integration']*data['upper']
return t*x
def Trial(t, temp, data):
calcdata = {}
counter = 0
keys = temp.keys()
for value0 in temp[keys[0]]:
for value1 in temp[keys[1]]:
for value2 in temp[keys[2]]:
data[keys[0]] = value0
data[keys[1]] = value1
data[keys[2]] = value2
x_axis, y_axis = np.vstack((t,np.vectorize(f)(data,t)))
calcdata[counter] = {}
calcdata[counter]['xaxis'] = x_axis
calcdata[counter]['yaxis'] = y_axis            
calcdata[counter][keys[0]] = value0  
calcdata[counter][keys[1]] = value1
calcdata[counter][keys[2]] = value2
counter+=1
return calcdata
data['focus'] = 100
t = np.linspace(1,10,10)
temp = {'integration': [1,2], 'upper':  [3,4], 'other':  [5,6]}
calcdata = Trial(t, temp, data)

以下是您可以使用的一般思路:

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上不是线程安全的(

>itertools.product为您提供所需的组合。问题是您需要从其结果重建字典。在此示例中,我将temp扩展为可用于更新data字典的(key, value)元组。我复制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)

最新更新