将字典转换为每种组合的字典列表

时间:2018-11-22 09:05:31

标签: python list dictionary

我有一个字典看起来像这样:

my_dict = {
    "a":[1, 2, 3],
    "b":[10],
    "c":[4, 5],
    "d":[11]
}

我想获得一个包含所有键和值的组合的列表,如下所示:

result = [
    {"a":1, "b":10, "c":4, "d":11},
    {"a":1, "b":10, "c":5, "d":11},
    {"a":2, "b":10, "c":4, "d":11},
    {"a":2, "b":10, "c":5, "d":11},
    {"a":3, "b":10, "c":4, "d":11},
    {"a":3, "b":10, "c":5, "d":11}
]

有人对此有解决方案吗? 是否有任何现有的解决方案可以执行此操作,或者我应该如何自己继续执行此操作?

谢谢。

5 个答案:

答案 0 :(得分:2)

itertools.product的任务:

>>> from itertools import product
>>> for dict_items in product(*[product([k],v) for k, v in my_dict.items()]):
...    print(dict(dict_items))

{'a': 1, 'b': 10, 'c': 4, 'd': 11}
{'a': 1, 'b': 10, 'c': 5, 'd': 11}
{'a': 2, 'b': 10, 'c': 4, 'd': 11}
{'a': 2, 'b': 10, 'c': 5, 'd': 11}
{'a': 3, 'b': 10, 'c': 4, 'd': 11}
{'a': 3, 'b': 10, 'c': 5, 'd': 11}

小解释:

内部product(...)会将字典扩展到诸如[[(k1, v11), (k1, v12), ...], [(k2, v21), (k2, v22), ...], ...]之类的列表。

外部product(...)将通过从每个列表中选择一个元组来重新组合项目列表。

dict(...)将根据(k1, v#), (k2, v#), ...元组的序列创建字典。

答案 1 :(得分:0)

假设您只对具有4个键的my_dict感兴趣,那么使用嵌套的for循环就很简单:

*?*

这给出了预期的结果。

答案 2 :(得分:0)

您可以使用:

from itertools import product
allNames = sorted(my_dict)
values= list(product(*(my_dict[Name] for Name in allNames)))
d = list(dict(zip(['a','b','c','d'],i)) for i in values)

输出:

[{'a': 1, 'c': 4, 'b': 10, 'd': 11}, 
{'a': 1, 'c': 5, 'b': 10, 'd': 11}, 
{'a': 2, 'c': 4, 'b': 10, 'd': 11}, 
{'a': 2, 'c': 5, 'b': 10, 'd': 11}, 
{'a': 3, 'c': 4, 'b': 10, 'd': 11}, 
{'a': 3, 'c': 5, 'b': 10, 'd': 11}]

答案 3 :(得分:0)

itertools.product产生一个迭代器列表的组合。

dict.values()获取所需的列表。

对于每种组合,将组合中的zip dict.keys()上移。

使用list comprehension收集它们:

from itertools import product
from pprint import pprint

my_dict = {
    "a":[1, 2, 3],
    "b":[10],
    "c":[4, 5],
    "d":[11]
}

result = [dict(zip(my_dict,i)) for i in product(*my_dict.values())]
pprint(result)

输出:

[{'a': 1, 'b': 10, 'c': 4, 'd': 11},
 {'a': 1, 'b': 10, 'c': 5, 'd': 11},
 {'a': 2, 'b': 10, 'c': 4, 'd': 11},
 {'a': 2, 'b': 10, 'c': 5, 'd': 11},
 {'a': 3, 'b': 10, 'c': 4, 'd': 11},
 {'a': 3, 'b': 10, 'c': 5, 'd': 11}]

答案 4 :(得分:-1)

尝试:

def permute(d):
    k = d.keys()
    perms = itertools.product(*d.values())
    return [dict(zip(k, v)) for v in perms]

>>> pprint(permute(my_dict))
[{'a': 1, 'b': 10, 'c': 4, 'd': 11},
 {'a': 1, 'b': 10, 'c': 5, 'd': 11},
 {'a': 2, 'b': 10, 'c': 4, 'd': 11},
 {'a': 2, 'b': 10, 'c': 5, 'd': 11},
 {'a': 3, 'b': 10, 'c': 4, 'd': 11},
 {'a': 3, 'b': 10, 'c': 5, 'd': 11}]