在Python中获取所有可能的字典配置列表

问题描述:

我有一个字典,它描述了可能的配置值,例如:在Python中获取所有可能的字典配置列表

{'a':[1,2], 'b':[3,4,5]} 

我想要生成所有可接受配置的列表,例如,

[{'a':1, 'b':3}, 
{'a':1, 'b':4}, 
{'a':1, 'b':5}, 
{'a':2, 'b':3}, 
{'a':2, 'b':4}, 
{'a':1, 'b':5}] 

我已经通过了文档和SO看了看,它肯定似乎涉及itertools.product,但没有一个嵌套循环,我不能得到它。

+2

检查最后一个应该是'{ 'A' 2, 'B':5}'权? – Hackaholic 2014-11-03 23:07:25

你并不需要一个嵌套循环for这里:

from itertools import product 
[dict(zip(d.keys(), combo)) for combo in product(*d.values())] 

product(*d.values())产生您所需的值组合,并再次dict(zip(d.keys(), combo))重组的钥匙每个组合。

演示:

>>> from itertools import product 
>>> d = {'a':[1,2], 'b':[3,4,5]} 
>>> list(product(*d.values())) 
[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)] 
>>> [dict(zip(d.keys(), combo)) for combo in product(*d.values())] 
[{'a': 1, 'b': 3}, {'a': 1, 'b': 4}, {'a': 1, 'b': 5}, {'a': 2, 'b': 3}, {'a': 2, 'b': 4}, {'a': 2, 'b': 5}] 
>>> from pprint import pprint 
>>> pprint(_) 
[{'a': 1, 'b': 3}, 
{'a': 1, 'b': 4}, 
{'a': 1, 'b': 5}, 
{'a': 2, 'b': 3}, 
{'a': 2, 'b': 4}, 
{'a': 2, 'b': 5}] 
+0

这可能值得展示'product(* d.values())'的中间步骤,使其更加明显,为什么这会起作用。 – abarnert 2014-11-03 23:06:48

+0

哼。我正在关闭[this](http://*.com/questions/15211568/combine-python-dictionary-permutations-into-list-of-dictionaries),但你的解释更为详细,而且这个问题有一个更好的标题。 – DSM 2014-11-03 23:17:01

+0

@DSM:它看起来不太公平,就像在另一个方向上的重复一样* *。关闭这个作为一个骗局对我来说很好。 – 2014-11-03 23:48:48

你也可以试试这个:

>>> dt={'a':[1,2], 'b':[3,4,5]} 
>>> [{'a':i,'b':j} for i in dt['a'] for j in dt['b']] 
[{'a': 1, 'b': 3}, {'a': 1, 'b': 4}, {'a': 1, 'b': 5}, {'a': 2, 'b': 3}, {'a': 2, 'b': 4}, {'a': 2, 'b': 5}]