在dict中获取列表的产品,同时保留相同的键

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)

如果有人想解决一个谜语,我很乐意看到你如何接近它.

Ash*_*ary 8

你可以使用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)