【问题标题】:How to generate all combination from values in dict of lists in Python如何从Python中列表的dict中的值生成所有组合
【发布时间】: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

标签: python dictionary combinations


【解决方案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')]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-05
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        相关资源
        最近更新 更多