簡體   English   中英

列出復雜的列表列表中的所有可能組合?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM