在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
,但没有一个嵌套循环,我不能得到它。
你并不需要一个嵌套循环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}]
这可能值得展示'product(* d.values())'的中间步骤,使其更加明显,为什么这会起作用。 – abarnert 2014-11-03 23:06:48
哼。我正在关闭[this](http://stackoverflow.com/questions/15211568/combine-python-dictionary-permutations-into-list-of-dictionaries),但你的解释更为详细,而且这个问题有一个更好的标题。 – DSM 2014-11-03 23:17:01
@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}]
检查最后一个应该是'{ 'A' 2, 'B':5}'权? – Hackaholic 2014-11-03 23:07:25