![](/img/trans.png)
[英]How do I turn a nested dict of lists (with dicts) into a single list of dicts?
[英]How do you turn a dict of lists into a list of dicts with all combinations?
基本上,我要尋找的是itertools.product
的等效物,但是dict
。
例如,假設我要測試一個函數的關鍵字參數的所有組合,我想傳遞每個關鍵字參數的允許值列表,然后獲取字典列表。
kwargs_options = {"debug": ["on", "off"],
"locale":["de_DE", "en_US", "fr_FR"]
預期輸出:
[{'debug': 'on', 'locale': 'de_DE'},
{'debug': 'on', 'locale': 'en_US'},
{'debug': 'on', 'locale': 'fr_FR'},
{'debug': 'off', 'locale': 'de_DE'},
{'debug': 'off', 'locale': 'en_US'},
{'debug': 'off', 'locale': 'fr_FR'}]
為了具有與itertools.product
類似的API,它應該返回一個迭代器,然后可以根據需要包裝itertools.product
list(...)
的調用。
示例調用:
list(dictproduct(kwargs_options}))
這類似於使用Python的字典中帶有列表值的組合,但返回的是兩個元素字典而不是兩個單元素字典的列表。
這是我想出的:
from itertools import product
def dictproduct(dct):
for t in product(*dct.itervalues()):
yield dict(zip(dct.iterkeys(), t))
這給了我們
>>> list(dictproduct({"debug":["on", "off"], "locale":["de_DE", "en_US", "fr_FR"]}))
[{'debug': 'on', 'locale': 'de_DE'},
{'debug': 'on', 'locale': 'en_US'},
{'debug': 'on', 'locale': 'fr_FR'},
{'debug': 'off', 'locale': 'de_DE'},
{'debug': 'off', 'locale': 'en_US'},
{'debug': 'off', 'locale': 'fr_FR'}]
這也可以用於有效地使用關鍵字參數的所有組合來調用函數:
def kwproduct(**kwargs):
return dictproduct(kwargs)
def f(x, y):
return 10*x + y
for kwargs in kwproduct(x=[1,2], y=[3,4,5]):
print "f({x},{y})={z}".format(z=f(**kwargs), **kwargs)
輸出:
f(1,3)=13
f(2,3)=23
f(1,4)=14
f(2,4)=24
f(1,5)=15
f(2,5)=25
與kwproduct
, dictproduct
的好處在於您無需創建dict
但是顯然限制了您使用有效的參數名稱作為鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.