Python创建字典的组合

Python创建字典的组合,python,dictionary,iteration,combinations,Python,Dictionary,Iteration,Combinations,我想将Python字典转换为以下形式: D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]} 以以下形式输入词典列表: E = [{a:1,b:0.1,c:10}, {a:1,b:0.1,c:20},{a:1,b:0.5,c:10}, ...., {a:3,b:0.5,c:20}] 我尝试过使用itertools,但不知道如何使用它来组合字典。这里有一个解决方案: import itertools D = {'a':[1,2,3], 'b':[0.1,

我想将Python字典转换为以下形式:

D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}
以以下形式输入词典列表:

E = [{a:1,b:0.1,c:10}, {a:1,b:0.1,c:20},{a:1,b:0.5,c:10}, ...., {a:3,b:0.5,c:20}]
我尝试过使用itertools,但不知道如何使用它来组合字典。

这里有一个解决方案:

import itertools

D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}

E = [dict(zip(D.keys(), a)) for a in itertools.product(*D.values())]
这将产生:

E= [{'a': 1, 'b': 0.1, 'c': 10},
 {'a': 1, 'b': 0.1, 'c': 20},
 {'a': 1, 'b': 0.5, 'c': 10},
 {'a': 1, 'b': 0.5, 'c': 20},
 {'a': 2, 'b': 0.1, 'c': 10},
 {'a': 2, 'b': 0.1, 'c': 20},
 {'a': 2, 'b': 0.5, 'c': 10},
 {'a': 2, 'b': 0.5, 'c': 20},
 {'a': 3, 'b': 0.1, 'c': 10},
 {'a': 3, 'b': 0.1, 'c': 20},
 {'a': 3, 'b': 0.5, 'c': 10},
 {'a': 3, 'b': 0.5, 'c': 20}]
编辑:删除有序的dict正如Aran指出的,这里有支持它的文档:

这里有一个解决方案:

import itertools

D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}

E = [dict(zip(D.keys(), a)) for a in itertools.product(*D.values())]
这将产生:

E= [{'a': 1, 'b': 0.1, 'c': 10},
 {'a': 1, 'b': 0.1, 'c': 20},
 {'a': 1, 'b': 0.5, 'c': 10},
 {'a': 1, 'b': 0.5, 'c': 20},
 {'a': 2, 'b': 0.1, 'c': 10},
 {'a': 2, 'b': 0.1, 'c': 20},
 {'a': 2, 'b': 0.5, 'c': 10},
 {'a': 2, 'b': 0.5, 'c': 20},
 {'a': 3, 'b': 0.1, 'c': 10},
 {'a': 3, 'b': 0.1, 'c': 20},
 {'a': 3, 'b': 0.5, 'c': 10},
 {'a': 3, 'b': 0.5, 'c': 20}]

编辑:删除有序dict正如Aran指出的,这里有支持它的文档:

一个选项是简单地使用嵌套for循环;如果原始数据不是太大,那么这将正常工作,您不需要使用
itertools

>>> origin = {
    'a': [1, 2, 3],
    'b': [0.1, 0.5],
    'c': [10, 20],
}
>>> result = [
    {
        'a': a,
        'b': b,
        'c': c,
    }
    for a in origin['a']
    for b in origin['b']
    for c in origin['c']]
>>> result
[{'a': 1, 'b': 0.1, 'c': 10}, {'a': 1, 'b': 0.1, 'c': 20},
 {'a': 1, 'b': 0.5, 'c': 10}, {'a': 1, 'b': 0.5, 'c': 20},
 {'a': 2, 'b': 0.1, 'c': 10}, {'a': 2, 'b': 0.1, 'c': 20},
 {'a': 2, 'b': 0.5, 'c': 10}, {'a': 2, 'b': 0.5, 'c': 20},
 {'a': 3, 'b': 0.1, 'c': 10}, {'a': 3, 'b': 0.1, 'c': 20},
 {'a': 3, 'b': 0.5, 'c': 10}, {'a': 3, 'b': 0.5, 'c': 20}]

一种选择是简单地使用嵌套for循环;如果原始数据不是太大,那么这将正常工作,您不需要使用
itertools

>>> origin = {
    'a': [1, 2, 3],
    'b': [0.1, 0.5],
    'c': [10, 20],
}
>>> result = [
    {
        'a': a,
        'b': b,
        'c': c,
    }
    for a in origin['a']
    for b in origin['b']
    for c in origin['c']]
>>> result
[{'a': 1, 'b': 0.1, 'c': 10}, {'a': 1, 'b': 0.1, 'c': 20},
 {'a': 1, 'b': 0.5, 'c': 10}, {'a': 1, 'b': 0.5, 'c': 20},
 {'a': 2, 'b': 0.1, 'c': 10}, {'a': 2, 'b': 0.1, 'c': 20},
 {'a': 2, 'b': 0.5, 'c': 10}, {'a': 2, 'b': 0.5, 'c': 20},
 {'a': 3, 'b': 0.1, 'c': 10}, {'a': 3, 'b': 0.1, 'c': 20},
 {'a': 3, 'b': 0.5, 'c': 10}, {'a': 3, 'b': 0.5, 'c': 20}]
为什么不只是:

from itertools import product
D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}
print([dict(zip(D.keys(),v)) for v in product(*D.values())])
输出:

[{'a': 1, 'b': 0.1, 'c': 10}, {'a': 1, 'b': 0.1, 'c': 20}, {'a': 1, 'b': 0.5, 'c': 10}, {'a': 1, 'b': 0.5, 'c': 20}, {'a': 2, 'b': 0.1, 'c': 10}, {'a': 2, 'b': 0.1, 'c': 20}, {'a': 2, 'b': 0.5, 'c': 10}, {'a': 2, 'b': 0.5, 'c': 20}, {'a': 3, 'b': 0.1, 'c': 10}, {'a': 3, 'b': 0.1, 'c': 20}, {'a': 3, 'b': 0.5, 'c': 10}, {'a': 3, 'b': 0.5, 'c': 20}]
为什么不只是:

from itertools import product
D = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}
print([dict(zip(D.keys(),v)) for v in product(*D.values())])
输出:

[{'a': 1, 'b': 0.1, 'c': 10}, {'a': 1, 'b': 0.1, 'c': 20}, {'a': 1, 'b': 0.5, 'c': 10}, {'a': 1, 'b': 0.5, 'c': 20}, {'a': 2, 'b': 0.1, 'c': 10}, {'a': 2, 'b': 0.1, 'c': 20}, {'a': 2, 'b': 0.5, 'c': 10}, {'a': 2, 'b': 0.5, 'c': 20}, {'a': 3, 'b': 0.1, 'c': 10}, {'a': 3, 'b': 0.1, 'c': 20}, {'a': 3, 'b': 0.5, 'c': 10}, {'a': 3, 'b': 0.5, 'c': 20}]

我想出了一个大概的答案

parameter_values_each = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}

param_possibilities = []
for name in parameter_values_each:
    temp = []
    for val in parameter_values_each[name]:
        temp.append((name,val))
    param_possibilities.append(temp)


result = list(itertools.product(*param_possibilities))

print result

我想出了一个大概的答案

parameter_values_each = {'a':[1,2,3], 'b':[0.1,0.5], 'c':[10,20]}

param_possibilities = []
for name in parameter_values_each:
    temp = []
    for val in parameter_values_each[name]:
        temp.append((name,val))
    param_possibilities.append(temp)


result = list(itertools.product(*param_possibilities))

print result

没有itertools的漫长道路(或者这就是产品内部发生的事情)

结果:

{'a': 1, 'b': 0.1, 'c': 10}
{'a': 1, 'b': 0.1, 'c': 20}
{'a': 1, 'b': 0.5, 'c': 10}
{'a': 1, 'b': 0.5, 'c': 20}
{'a': 2, 'b': 0.1, 'c': 10}
{'a': 2, 'b': 0.1, 'c': 20}
{'a': 2, 'b': 0.5, 'c': 10}
{'a': 2, 'b': 0.5, 'c': 20}
{'a': 3, 'b': 0.1, 'c': 10}
{'a': 3, 'b': 0.1, 'c': 20}
{'a': 3, 'b': 0.5, 'c': 10}
{'a': 3, 'b': 0.5, 'c': 20}

没有itertools的漫长道路(或者这就是产品内部发生的事情)

结果:

{'a': 1, 'b': 0.1, 'c': 10}
{'a': 1, 'b': 0.1, 'c': 20}
{'a': 1, 'b': 0.5, 'c': 10}
{'a': 1, 'b': 0.5, 'c': 20}
{'a': 2, 'b': 0.1, 'c': 10}
{'a': 2, 'b': 0.1, 'c': 20}
{'a': 2, 'b': 0.5, 'c': 10}
{'a': 2, 'b': 0.5, 'c': 20}
{'a': 3, 'b': 0.1, 'c': 10}
{'a': 3, 'b': 0.1, 'c': 20}
{'a': 3, 'b': 0.5, 'c': 10}
{'a': 3, 'b': 0.5, 'c': 20}

您使用
itertools
完成了哪些工作?您是否成功地将列表生成笛卡尔积?您使用
itertools
完成了哪些工作?您是否已将列表制作成笛卡尔乘积?
OrderedDict
在这里是不必要的。是的,dict迭代顺序是任意的,它不会无缘无故地神奇地改变。它只能在您修改字典时更改,而您没有这样做。
OrderedDict
在这里不是必需的。是的,dict迭代顺序是任意的,它不会无缘无故地神奇地改变。只有当你修改字典时,它才能改变,而你没有这样做。如果有很多键,或者OP不知道其中任何一个键,会发生什么情况?@U9 Forward我的答案对于更大数量的键不是很实用,也不是真正的可伸缩性;但是,由于问题没有规定可伸缩性是一项要求,我想为所有
itertools
答案添加一个替代解决方案。如果有很多键,或者OP不知道其中任何一个键,会发生什么情况?@U9 Forward我的答案对于更大数量的键不是很实用,也不是真正的可伸缩性;但是,由于这个问题没有将可伸缩性作为一项要求,我想为所有
itertools
答案添加一个替代解决方案。