2014-11-03 81 views
0

我有一個字典,它描述了可能的配置值,例如:在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

回答

3

你並不需要一個嵌套循環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://stackoverflow.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

0

你也可以試試這個:

>>> 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}] 
相關問題