[英]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.