oza*_*gon 3 python dictionary product list
我有以下词典:
my_dict = {'A': [1, 2], 'B': [1, 4]}
我想最终得到一个像这样的dicts列表:
[
{'A': 1, 'B': 1},
{'A': 1, 'B': 4},
{'A': 2, 'B': 1},
{'A': 2, 'B': 4}
]
Run Code Online (Sandbox Code Playgroud)
所以,我是在使用dict列表的产品,表达为使用与传入字典相同的键的dicts列表.
我得到的最接近的是:
my_dict = {'A': [1, 2], 'B': [1, 4]}
it = []
for k in my_dict.keys():
current = my_dict.pop(k)
for i in current:
it.append({k2: i2 for k2, i2 in my_dict.iteritems()})
it[-1].update({k: i})
Run Code Online (Sandbox Code Playgroud)
除了看起来很可怕之外,它不能给我我想要的东西:
[
{'A': 1, 'B': [1, 4]},
{'A': 2, 'B': [1, 4]},
{'B': 1},
{'B': 4}
]
Run Code Online (Sandbox Code Playgroud)
如果有人想解决一个谜语,我很乐意看到你如何接近它.
你可以使用itertools.product它,即计算值的笛卡尔积,然后用字典中的键将它们中的每一个拉上.需要注意的是一个字典的顺序的keys()和相应的values(),如果它不是在中间修改,因此订货会不会在这里是一个问题仍然是相同的:
>>> from itertools import product
>>> my_dict = {'A': [1, 2], 'B': [1, 4]}
>>> keys = list(my_dict)
>>> [dict(zip(keys, p)) for p in product(*my_dict.values())]
[{'A': 1, 'B': 1}, {'A': 1, 'B': 4}, {'A': 2, 'B': 1}, {'A': 2, 'B': 4}]
Run Code Online (Sandbox Code Playgroud)