如何在dict中创建可能组合的列表?

时间:2017-01-07 16:17:47

标签: python dictionary combinations

我有一个python dict如下:

test = {"a": value_of_a,"b": value_of_b, "c": value_of_c}

其中value_of_a, value_of_b, value_of_c都是变量,可以取3个值:

  • value_of_a

  • 的1,2或3
  • value_of_b的“a”,“b”或“c”,

  • vaulue_of_c

  • 的45,180,250

我想创建一个dicts列表,其中每个dict包含这些值的一个组合。例如,一个字典可以如下:

test1 = {"a" : 2, "b" : "a", "c" : 45 }
test2 = {"a" : 3, "b" : "a", "c" : 45 }

依旧......

我没有任何想法如何继续解决这个问题?

注意:这些值只是为了简化任务,原始任务为每个任务提供了更多的键和值,但是如果我可以为这些琐碎的例子做这些,我可以为我的原始任务做。

3 个答案:

答案 0 :(得分:3)

我建议使用特殊itertools.combinations。请查看页面底部的示例 - 有一些有趣的案例。

{{1}}

答案 1 :(得分:3)

享受:

import itertools


def iterate_values(S):
    keys, values = zip(*S.items())

    for row in itertools.product(*values):
        yield dict(zip(keys, row))


S = {"a": [1, 2, 3], "b": ["a", "b", "c"], "c": [45, 180, 250]}

for d in iterate_values(S):
    print(d)

结果:

{'a': 1, 'c': 45, 'b': 'a'}
{'a': 1, 'c': 45, 'b': 'b'}
{'a': 1, 'c': 45, 'b': 'c'}
{'a': 1, 'c': 180, 'b': 'a'}
{'a': 1, 'c': 180, 'b': 'b'}
{'a': 1, 'c': 180, 'b': 'c'}
{'a': 1, 'c': 250, 'b': 'a'}
{'a': 1, 'c': 250, 'b': 'b'}
{'a': 1, 'c': 250, 'b': 'c'}
{'a': 2, 'c': 45, 'b': 'a'}
{'a': 2, 'c': 45, 'b': 'b'}
{'a': 2, 'c': 45, 'b': 'c'}
{'a': 2, 'c': 180, 'b': 'a'}
{'a': 2, 'c': 180, 'b': 'b'}
{'a': 2, 'c': 180, 'b': 'c'}
{'a': 2, 'c': 250, 'b': 'a'}
{'a': 2, 'c': 250, 'b': 'b'}
{'a': 2, 'c': 250, 'b': 'c'}
{'a': 3, 'c': 45, 'b': 'a'}
{'a': 3, 'c': 45, 'b': 'b'}
{'a': 3, 'c': 45, 'b': 'c'}
{'a': 3, 'c': 180, 'b': 'a'}
{'a': 3, 'c': 180, 'b': 'b'}
{'a': 3, 'c': 180, 'b': 'c'}
{'a': 3, 'c': 250, 'b': 'a'}
{'a': 3, 'c': 250, 'b': 'b'}
{'a': 3, 'c': 250, 'b': 'c'}

我将它实现为生成器,因为它可以节省你的内存。如果您需要一个确切的列表,您可以这样做:

lst = list(iterate_values(S))

答案 2 :(得分:1)

请指定您是否需要值列表中的所有可能组合或随机选择的元素。如果您想要每种组合,请使用@Eugene Litsisky的解决方案。如果您正在寻找一组带有从值列表中随机抽取的值的词典,则可以使用numpy.random.choice

import numpy as np

test1 = {'a': np.random.choice(value_of_a),
         'b': np.random.choice(value_of_b),
         'c': np.random.choice(value_of_c)}