Python:从列表的dict中的值生成所有组合

ibi*_*tux 12 python combinations dictionary

我想生成在dict中索引的列表中的所有值组合,如下所示:

{'A':['D','E'],'B':['F','G','H'],'C':['I','J']}
Run Code Online (Sandbox Code Playgroud)

每次,每个字典条目中的一个项目将被挑选并组合到其他键的项目,因此我们可以:

['D','F','I']
['D','F','J']
['D','G','I']
['D','G','J']
['D','H','I']
...
['E','H','J']
Run Code Online (Sandbox Code Playgroud)

我知道有一些东西可以在itertools中生成列表中的项目组合,但我不认为我可以在这里使用它,因为我有不同的"池"值.

有没有现成的解决方案,或者我应该如何继续自己做,我很坚持这个嵌套的结构.

Pab*_*blo 29

如果你想保持key:value排列,你可以使用:

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

这将为您提供具有排列的字典列表:

print(permutations_dicts)
[{'A':'D', 'B':'F', 'C':'I'}, 
 {'A':'D', 'B':'F', 'C':'J'},
 ...
 ]
Run Code Online (Sandbox Code Playgroud)

disclaimer 不完全是 OP 的要求,但谷歌把我送到这里寻找。


小智 28

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))
Run Code Online (Sandbox Code Playgroud)

打印

[('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', '我'),('E','H','J')]


Kev*_*sen 6

如何使用 scikit-learn 中的 ParameterGrid?它创建了一个生成器,您可以在正常的 for 循环中对其进行迭代。在每次迭代中,您将拥有一个包含当前参数组合的字典。

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"])

Run Code Online (Sandbox Code Playgroud)