如何从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中的值生成所有组合的主要内容,如果未能解决你的问题,请参考以下文章

捋一捋Python中的Dict(下)

Python函数,用于组织lis,字典中的值

在python中建立一组列表后,怎么从列表中提取元素

如何从 Python 中的“dict”对象列表中基于键提取值

从Dict(python)中的itemgetter查找值

如何从 Python 中的字典中提取所有值?