如何在Python中从列表的dict中的值生成所有组合

afdcj2ne  于 2023-01-04  发布在  Python
关注(0)|答案(5)|浏览(195)

我想生成在一个dict中索引的列表中的值的所有组合:

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

每一次,每个dict条目的一个条目将被选取并与来自其他键的条目组合,因此我有:

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

我知道在itertools中有一个东西可以生成列表中项目的组合,但是我不认为我可以在这里使用它,因为我有不同的值“池”。
是否有任何现有的解决方案可以做到这一点,或者我应该如何继续自己做,我相当坚持这个嵌套结构。

hrysbysz

hrysbysz1#

如果你想保持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'},
 ...
 ]

**免责声明:**不完全是操作程序所要求的,但谷歌发送我到这里寻找。如果你想获得操作程序所要求的,你应该只是删除在列表理解的dict部分,即。

permutations_dicts = [v for v in itertools.product(*values)]
ki0zmccv

ki0zmccv2#

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', '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')]
gcuhipw9

gcuhipw93#

使用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"])
qvtsj1bj

qvtsj1bj4#

from itertools import combinations

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

list(combinations(a,2))

输出将为:

[('I1', 'I2'),
 ('I1', 'I3'),
 ('I1', 'I4'),
 ('I1', 'I5'),
 ('I2', 'I3'),
 ('I2', 'I4'),
 ('I2', 'I5'),
 ('I3', 'I4'),
 ('I3', 'I5'),
 ('I4', 'I5')]
wnrlj8wa

wnrlj8wa5#

作为补充,这里有一个3-liner程序,它用纯python实现了这个功能,这样您就可以理解这个概念,但是itertools确实更高效。

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

相关问题