我有一个清单字典。我想生成这些列表的所有组合,并以正确的键和值对映射将这些组合作为字典列表返回。
到目前为止,我已经通过部署下面的代码实现了这一点,但是我想在整个过程中明确键和值对的映射,而不是依赖下面的枚举方法。考虑到没有命令字典使枚举方法可能无法正确地映射键值对,我对此感到担忧。无论如何,我正在寻找实现结果的最pythonic方法。
import itertools
dct_lst = {'Apple':[3,5,7],'Pear':[5,2],'Orange':[10],'Banana':[7,10],'Lemon':[5,7,9,2,1]}
combs = itertools.product(*(dct_lst[key] for key in dct_lst.keys()))
lst_dct = []
for comb in combs:
dct = {}
for j,key in enumerate(dct_lst.keys()):
dct[key] = comb[j]
lst_dct.append(dct)
lst_dct
[{'Apple': 3, 'Banana': 7, 'Lemon': 5, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 7, 'Lemon': 7, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 7, 'Lemon': 9, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 7, 'Lemon': 2, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 7, 'Lemon': 1, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 10, 'Lemon': 5, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 10, 'Lemon': 7, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 10, 'Lemon': 9, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 10, 'Lemon': 2, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 10, 'Lemon': 1, 'Orange': 10, 'Pear': 5},
{'Apple': 3, 'Banana': 7, 'Lemon': 5, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 7, 'Lemon': 7, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 7, 'Lemon': 9, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 7, 'Lemon': 2, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 7, 'Lemon': 1, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 10, 'Lemon': 5, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 10, 'Lemon': 7, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 10, 'Lemon': 9, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 10, 'Lemon': 2, 'Orange': 10, 'Pear': 2},
{'Apple': 3, 'Banana': 10, 'Lemon': 1, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 7, 'Lemon': 5, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 7, 'Lemon': 7, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 7, 'Lemon': 9, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 7, 'Lemon': 2, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 7, 'Lemon': 1, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 10, 'Lemon': 5, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 10, 'Lemon': 7, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 10, 'Lemon': 9, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 10, 'Lemon': 2, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 10, 'Lemon': 1, 'Orange': 10, 'Pear': 5},
{'Apple': 5, 'Banana': 7, 'Lemon': 5, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 7, 'Lemon': 7, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 7, 'Lemon': 9, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 7, 'Lemon': 2, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 7, 'Lemon': 1, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 10, 'Lemon': 5, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 10, 'Lemon': 7, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 10, 'Lemon': 9, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 10, 'Lemon': 2, 'Orange': 10, 'Pear': 2},
{'Apple': 5, 'Banana': 10, 'Lemon': 1, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 7, 'Lemon': 5, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 7, 'Lemon': 7, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 7, 'Lemon': 9, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 7, 'Lemon': 2, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 7, 'Lemon': 1, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 10, 'Lemon': 5, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 10, 'Lemon': 7, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 10, 'Lemon': 9, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 10, 'Lemon': 2, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 10, 'Lemon': 1, 'Orange': 10, 'Pear': 5},
{'Apple': 7, 'Banana': 7, 'Lemon': 5, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 7, 'Lemon': 7, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 7, 'Lemon': 9, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 7, 'Lemon': 2, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 7, 'Lemon': 1, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 10, 'Lemon': 5, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 10, 'Lemon': 7, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 10, 'Lemon': 9, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 10, 'Lemon': 2, 'Orange': 10, 'Pear': 2},
{'Apple': 7, 'Banana': 10, 'Lemon': 1, 'Orange': 10, 'Pear': 2}]
结果符合预期。不过,我对实现此结果的最可靠的pythonic方法感兴趣。
答案 0 :(得分:2)
您可以重复键和值来构建项目列表:
>>> import itertools
>>> dct_lst = {'Apple':[3,5,7],'Pear':[5,2],'Orange':[10],'Banana':[7,10],'Lemon':[5,7,9,2,1]}
>>> L = [[(k, v) for v in vs] for k, vs in dct_lst.items()]
>>> L
[[('Apple', 3), ('Apple', 5), ('Apple', 7)], [('Pear', 5), ('Pear', 2)], [('Orange', 10)], [('Banana', 7), ('Banana', 10)], [('Lemon', 5), ('Lemon', 7), ('Lemon', 9), ('Lemon', 2), ('Lemon', 1)]]
并使用itertools.product
创建所有组合:
>>> list (itertools.product(*L))
[(('Apple', 3), ('Pear', 5), ('Orange', 10), ('Banana', 7), ('Lemon', 5)), (('Apple', 3), ('Pear', 5), ('Orange', 10), ('Banana', 7), ('Lemon', 7)), (('Apple', 3), ('Pear', 5), ('Orange', 10), ('Banana', 7), ('Lemon', 9)), ..., (('Apple', 7), ('Pear', 2), ('Orange', 10), ('Banana', 7), ('Lemon', 2)), (('Apple', 7), ('Pear', 2), ('Orange', 10), ('Banana', 7), ('Lemon', 1)), (('Apple', 7), ('Pear', 2), ('Orange', 10), ('Banana', 10), ('Lemon', 5)), (('Apple', 7), ('Pear', 2), ('Orange', 10), ('Banana', 10), ('Lemon', 7)), (('Apple', 7), ('Pear', 2), ('Orange', 10), ('Banana', 10), ('Lemon', 9)), (('Apple', 7), ('Pear', 2), ('Orange', 10), ('Banana', 10), ('Lemon', 2)), (('Apple', 7), ('Pear', 2), ('Orange', 10), ('Banana', 10), ('Lemon', 1))]
输出由元组组成,但是很容易创建字典:
>>> list(map(dict, itertools.product(*L)))
[{'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 5}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 7}, ..., {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 1}]
答案 1 :(得分:1)
您可以使用ChianMap
来帮助最终合并字典。
尝试一下:
from itertools import product
from collections import ChainMap
dct_lst = {'Apple':[3,5,7],'Pear':[5,2],'Orange':[10],'Banana':[7,10],'Lemon':[5,7,9,2,1]}
flat_dicts = [[{key: val} for val in lst] for key, lst in dct_lst.items()]
lst_dct = list(map(lambda d: dict(ChainMap(*d)), product(*flat_dicts)))
print(lst_dct)
答案 2 :(得分:1)
您可以仅对字典的值使用itertools.product
,然后将dict(zip(...))
的键和值一起使用以输出字典列表。
from itertools import product
d = {'Apple':[3,5,7],'Pear':[5,2],'Orange':[10],'Banana':[7,10],'Lemon':[5,7,9,2,1]}
l = [dict(zip(d.keys(), vals)) for vals in product(*d.values())]
print(l)
# [{'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 5}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 7}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 9}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 2}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 1}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 5}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 7}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 9}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 2}, {'Apple': 3, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 1}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 5}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 7}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 9}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 2}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 1}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 5}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 7}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 9}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 2}, {'Apple': 3, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 1}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 5}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 7}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 9}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 2}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 1}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 5}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 7}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 9}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 2}, {'Apple': 5, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 1}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 5}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 7}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 9}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 2}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 1}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 5}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 7}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 9}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 2}, {'Apple': 5, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 1}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 5}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 7}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 9}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 2}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 7, 'Lemon': 1}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 5}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 7}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 9}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 2}, {'Apple': 7, 'Pear': 5, 'Orange': 10, 'Banana': 10, 'Lemon': 1}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 5}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 7}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 9}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 2}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 7, 'Lemon': 1}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 5}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 7}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 9}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 2}, {'Apple': 7, 'Pear': 2, 'Orange': 10, 'Banana': 10, 'Lemon': 1}]