我有一个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
value_of_b
的“a”,“b”或“c”,
vaulue_of_c
我想创建一个dicts列表,其中每个dict包含这些值的一个组合。例如,一个字典可以如下:
test1 = {"a" : 2, "b" : "a", "c" : 45 }
test2 = {"a" : 3, "b" : "a", "c" : 45 }
依旧......
我没有任何想法如何继续解决这个问题?
注意:这些值只是为了简化任务,原始任务为每个任务提供了更多的键和值,但是如果我可以为这些琐碎的例子做这些,我可以为我的原始任务做。
答案 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)}