如何从Python中列表的dict中的值生成所有组合
Posted
技术标签:
【中文标题】如何从Python中列表的dict中的值生成所有组合【英文标题】:How to generate all combination from values in dict of lists in Python 【发布时间】:2016-12-07 21:23:48 【问题描述】:我想生成在字典中索引的列表中的所有值组合:
'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
的列表中生成项目组合,但我认为我不能在这里使用它,因为我有不同的值“池”。
是否有任何现有的解决方案可以做到这一点,或者我应该如何自己去做,我完全被这种嵌套结构所困扰。
【问题讨论】:
那你应该试着写代码来做,有问题再回来。itertools.product(*yourdict.values())
字典未排序!请澄清。
我尝试编写代码但卡住了,我实际上正在寻找一个现有的解决方案,而不是浪费我的时间......我不明白你为什么说字典没有排序,我知道这与我的问题无关,我想要组合,而不是排列。 @Phillip:谢谢,我正在尝试。
您接受了订单。为什么D
是第一个字母,而不是...说F
?
【参考方案1】:
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')]
【讨论】:
需要先对字典进行排序,否则值可能与错误的键相关联【参考方案2】:如果您想在排列中保留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 的要求,但谷歌将我发送到这里寻找。
【讨论】:
【参考方案3】:使用 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"])
【讨论】:
如果您已经在使用scikit-learn
的环境中工作,那就太好了。不过,itertools
是标准库的一部分。
这是我的最佳答案,谢谢。【参考方案4】:
作为补充,这里是用 Python 编写的代码,以便您理解,但itertools
确实更有效。
res = [[]]
for _, vals in my_dict.items():
res = [x+[y] for x in res for y in vals]
print(res)
【讨论】:
【参考方案5】: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')]
【讨论】:
以上是关于如何从Python中列表的dict中的值生成所有组合的主要内容,如果未能解决你的问题,请参考以下文章