簡體   English   中英

如何將列表的字典轉換為具有所有組合的字典列表?

[英]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

kwproductdictproduct的好處在於您無需創建dict但是顯然限制了您使用有效的參數名稱作為鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM