Python 将dict转换为每个组合的dict列表

Python 将dict转换为每个组合的dict列表,python,list,dictionary,Python,List,Dictionary,我有一个dict看起来像这样: 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, "

我有一个dict看起来像这样:

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}
]
有人能解决这个问题吗? 是否有任何现有的解决方案可以做到这一点,或者我应该如何着手自己做到这一点

谢谢。

试试:

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

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

>>> pprint(permute(d))
[{'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}]
尝试:

用法示例:

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

>>> pprint(permute(d))
[{'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个键的my_dict感兴趣,那么使用嵌套for循环就足够简单了:

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

result = []
for a_val in my_dict['a']:
    for b_val in my_dict['b']:
        for c_val in my_dict['c']:
            for d_val in my_dict['d']:
                result.append({'a': a_val, 'b': b_val, 'c': c_val, 'd': d_val})

print(result)

这给出了预期的结果。

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

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

result = []
for a_val in my_dict['a']:
    for b_val in my_dict['b']:
        for c_val in my_dict['c']:
            for d_val in my_dict['d']:
                result.append({'a': a_val, 'b': b_val, 'c': c_val, 'd': d_val})

print(result)
这将给出预期的结果。

一项任务用于:

小说明:

内部
产品(…)
将dict扩展为一个列表,如
[(k1,v11),(k1,v12),…],[(k2,v21),(k2,v22),…],…]

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

dict(…)
将从
(k1,v#)、(k2,v#)、…
元组序列创建一个字典。

任务:

小说明:

内部
产品(…)
将dict扩展为一个列表,如
[(k1,v11),(k1,v12),…],[(k2,v21),(k2,v22),…],…]

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

dict(…)
将从
(k1,v#)、(k2,v#)、…
元组序列创建字典。

您可以使用:

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}]
[{'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}]
您可以使用:

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}]
[{'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}]

itertools.product
生成迭代器列表的组合

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

对于每个组合,
zip
向上移动组合的
dict.keys()

使用
列表理解
收集它们:

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, '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}]
[{'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}]

itertools.product
生成迭代器列表的组合

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

对于每个组合,
zip
向上移动组合的
dict.keys()

使用
列表理解
收集它们:

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, '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}]
[{'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}]

我希望使用itertools.compositions您可以生成列表的各种组合,但不确定是否为字典生成。我希望使用itertools.compositions您可以生成列表的各种组合,但不确定是否为字典生成。谢谢您的回答,但我不能使用它,因为“我的字典”可以包含不同名称的不同数量的密钥。没问题。那么,
itertools
方法绝对是正确的!谢谢您的回答,但我不能使用它,因为“我的字典”可以包含不同名称的不同数字的密钥。没问题。那么,
itertools
方法绝对是正确的!非常感谢您的解释!现在更清楚了;)非常感谢您的解释!现在更清楚了;)谢谢你的解释;)谢谢你的解释;)