[英]List all possible combinations from a complex dictionary of lists of lists?
我有一本字典,其中包含字符串, None
,列表和列表列表,如下例所示。
理想的结果是词典列表。 词典的数量等于可能的总排列数量。
要求是每个词典都可以不包含None
值或一个值列表,但varVal
的列表列表长度等于varName
的长度(即len(d['varVal'] = len(d['varName']
)。
我认为已经解决了None
问题,并且将varString
为列表可以防止将字符串分成字符。
尽管没有足够的想法,但到目前为止,我已经搜寻了很多溢出的帖子, 其中最有帮助的一个 。 任何帮助将不胜感激。 谢谢。
例
这个例子没有产生期望的结果:(
import itertools as it
d={}
d['varString']=['ExampleText']
d['n1']=[1,100]
d['n2']=None
d['varName']=['varA','varB']
d['varVal']=[[10],[1,0]]
df = {k:v for k,v in d.items() if v is not None}
keys, values = zip(*df.items())
res = [dict(zip(keys, v)) for v in it.product(*values)]
所需结果
在字典之间添加额外的空间以帮助视觉呈现。
res = [
{'n1': 1,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [[10], [0]]},
{'n1': 100,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [[10], [0]]},
{'n1': 1,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [[10], [1]]},
{'n1': 100,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [[10], [1]]}
]
PeterE的评论使我思考这个问题有点不同,从而得出了这个答案。
该答案分别处理引起问题的条目,然后进行一些后处理以返回所需的格式。 本质上,创建和掩盖最终导致问题的所需字典格式的其他步骤。
如果有一种方法可以按照我想知道的原始问题中的说明以某种更直接的方法进行处理。 感谢那些发表评论的人。
解
import itertools as it
def standKeys():
# Standard input parameters for dymola.simulateExtendedModel
keys = ['n1',
'n2',
'varString',
'varName',
'varVal']
return keys
def initSettings():
# Initialize the settings parameters
simSettings = {}
for key in standKeys():
simSettings[key]=None
return simSettings
def genExperimentsRaw(simSettings):
# Remove None and generate all experiment permutations
simSettingsfiltered = {k:v for k,v in simSettings.items() if v is not None}
keys, values = zip(*simSettingsfiltered.items())
experimentsRaw = [dict(zip(keys, v)) for v in it.product(*values)]
return experimentsRaw
def genExperiments(experimentsRaw):
# Filter experiments to generate key/value pairs for 'varName' and 'varVal'
allKeys = standKeys()
experiments = []
for i, value in enumerate(experimentsRaw):
initialNames = []
initialValues = []
for key, val in value.items():
if key not in allKeys:
initialNames.append(key)
initialValues.append(val)
value.pop(key)
value['varName']=initialNames
value['varVal']=initialValues
experiments.append(initSettings())
experiments[i].update(value)
return experiments
if __name__ == "__main__":
d={}
d['n1']=[1,100]
d['n2']=None
d['varString']=['ExampleText']
# Original
# d['varName']=['varA','varB'] # Remove this
# d['varVal']=[[10],[1,0]]
# Separate out and treat like other dictionary keys
d['varA']=[10]
d['varB']=[1,0]
# Generate all experiment permutations
experimentsRaw = genExperimentsRaw(d)
# Filter experiments to generate key/value pairs for 'varName' and 'varVal'
experiments = genExperiments(experimentsRaw)
结果
[{'n1': 1,
'n2': None,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [10, 1]},
{'n1': 1,
'n2': None,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [10, 0]},
{'n1': 100,
'n2': None,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [10, 1]},
{'n1': 100,
'n2': None,
'varName': ['varA', 'varB'],
'varString': 'ExampleText',
'varVal': [10, 0]}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.