2017-01-26 11 views
0

基本的に私が探しているのは、itertools.productに相当しますが、dictに相当します。リストの辞書をすべての組み合わせの辞書のリストにするにはどうすればよいですか?

たとえば、キーワード引数のすべての組み合わせに対して関数をテストするとします。キーワード引数ごとに許容値のリストを渡してから、辞書のリストを取得したいとします。

kwargs_options = {"debug": ["on", "off"], 
        "locale":["de_DE", "en_US", "fr_FR"] 

期待ouputを:必要に応じて、その後list(...)への呼び出しでラップすることができますイテレータを返す必要がありitertools.productこれに似たAPIを持つために

[{'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'}] 

例コール:

list(dictproduct(kwargs_options})) 

これはCombinations from dictionary with list values using Pythonに類似しているが、2つの要素dictsなく、2つの単一要素dictsのリストを返します。

+2

自己解答は問題ありませんが、*質問はまだトピック上にある必要があります。この質問は、文脈の答えなしでは、答えることができません。 –

+1

実際の具体的な例を含めて、サンプルの入力と期待される出力は、この疑問をより明確にするための道のりになります。 –

+0

申し訳ありませんが、私は別の質問(私が参照した)を見て答えを出し、それを共有したいと思っていました。だから私は質問に突っ込んだ。私は今それをもっと明確にしました。 – snth

答えて

3

これは私が出ているものです:

:これも効率的にキーワード引数のすべての組み合わせで機能を呼び出すために使用することができ、私たちに

>>> 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'}] 

を与える

from itertools import product 

def dictproduct(dct): 
    for t in product(*dct.itervalues()): 
     yield dict(zip(dct.iterkeys(), t)) 

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 

の利点は、dictを作成する必要はありませんが、有効な引数名をキーとして使用することは明らかです。

+0

downvoting質問、upvoting答え。 – Tagc

関連する問題