How to generate all combination from values in dict of lists in Python

后端 未结 5 1464
野的像风
野的像风 2020-12-09 03:22

I would like to generate all combinations of values which are in lists indexed in a dict:

{\'A\':[\'D\',\'E\'],\'B\':[\'F\',\'G\',\'H\'],\'C\':[\'I\',\'J\']}         


        
相关标签:
5条回答
  • 2020-12-09 03:46

    If you want to keep the key:value in the permutations you can use:

    import itertools
    keys, values = zip(*my_dict.items())
    permutations_dicts = [dict(zip(keys, v)) for v in itertools.product(*values)]
    

    this will provide you a list of dicts with the permutations:

    print(permutations_dicts)
    [{'A':'D', 'B':'F', 'C':'I'}, 
     {'A':'D', 'B':'F', 'C':'J'},
     ...
     ]
    

    disclaimer not exactly what the OP was asking, but google send me here looking for that.

    0 讨论(0)
  • 2020-12-09 03:48
    import itertools as it
    
    my_dict={'A':['D','E'],'B':['F','G','H'],'C':['I','J']}
    allNames = sorted(my_dict)
    combinations = it.product(*(my_dict[Name] for Name in allNames))
    print(list(combinations))
    

    Which prints:

    [('D', 'F', 'I'), ('D', 'F', 'J'), ('D', 'G', 'I'), ('D', 'G', 'J'), ('D', 'H', 'I'), ('D', 'H', 'J'), ('E', 'F', 'I'), ('E', 'F', 'J'), ('E', 'G', 'I'), ('E', 'G', 'J'), ('E', 'H', 'I'), ('E', 'H', 'J')]
    
    0 讨论(0)
  • 2020-12-09 04:07
    from itertools import combinations
    
    a=['I1','I2','I3','I4','I5']
    
    list(combinations(a,2))
    

    The output will be:

    [('I1', 'I2'),
     ('I1', 'I3'),
     ('I1', 'I4'),
     ('I1', 'I5'),
     ('I2', 'I3'),
     ('I2', 'I4'),
     ('I2', 'I5'),
     ('I3', 'I4'),
     ('I3', 'I5'),
     ('I4', 'I5')]
    
    0 讨论(0)
  • 2020-12-09 04:08

    As a complement, here is code that does it Python so that you get the idea, but itertools is indeed more efficient.

    res = [[]]
    for _, vals in my_dict.items():
        res = [x+[y] for x in res for y in vals]
    print(res)
    
    0 讨论(0)
  • 2020-12-09 04:09

    How about using ParameterGrid from scikit-learn? It creates a generator over which you can iterate in a normal for loop. In each iteration, you will have a dictionary containing the current parameter combination.

    from sklearn.model_selection import ParameterGrid
    
    params = {'A':['D','E'],'B':['F','G','H'],'C':['I','J']}
    param_grid = ParameterGrid(params)
    for dict_ in param_grid:
        # Do something with the current parameter combination in ``dict_``
        print(dict_["A"])
        print(dict_["B"])
        print(dict_["C"])
    
    
    0 讨论(0)
提交回复
热议问题