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

时间:2016-08-02 13:28:57

标签: python dictionary combinations

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

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

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

['D','F','I']
['D','F','J']
['D','G','I']
['D','G','J']
['D','H','I']
...
['E','H','J']

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

是否有任何现有的解决方案可以做到这一点,或者我应该如何继续自己做,我对这个嵌套结构非常感兴趣。

6 个答案:

答案 0 :(得分:25)

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

打印

  

[(' D',' F','我'),(' D',' F' ,' J'),(' D',' G',' I'),(' D' ,' G' J'),(' D',' H','我'),( ' D',' H',' J'),(' E',' F',' ;我'),(' E',' F',' J'),(' E',' G','我'),(' E',' G',' J'),' E& #39;,' H','我'),(' E',' H',' J' )]

答案 1 :(得分:16)

如果要将key:value保留在排列范围内,可以使用:

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

这将为您提供一系列排列的字典:

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

disclaimer并不完全是OP的要求,但是google将我送到这里寻找。

答案 2 :(得分:4)

如何从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"])

答案 3 :(得分:3)

从itertools导入组合

a = ['I1','I2','I3','I4','I5']

列表(组合(a,2))

输出将是

[('I1','I2'),  (“ I1”,“ I3”),  (“ I1”,“ I4”),  (“ I1”,“ I5”),  (“ I2”,“ I3”),  (“ I2”,“ I4”),  (“ I2”,“ I5”),  (“ I3”,“ I4”),  (“ I3”,“ I5”),  (“ I4”,“ I5”)]

答案 4 :(得分:1)

作为补充,这里有一个3层代码,它使用纯python来完成,以便您理解,但itertools确实更有效。

res = [[]]
for _, vals in my_dict.items():
    res = [x+[y] for x in res for y in vals]
print(res)

答案 5 :(得分:-1)

除了使用Maryam提供的笛卡尔积外,您还可以使用朴素的嵌套循环来获取所需的内容。