2016-08-08 4 views
-1
def funct (**kwargs): 
    #code goes here 

私はこの関数に渡す引数の数が可変です。 {SET1}、KEY2:引数はフォームキー1である{SET2}、及びそのFUNCTインサイド kwargs of keyからの辞書のリスト:set pair

に私はいくつかの方法が与えられたkwargsから

場合から「合成された」次のデータ構造を持つようにしたいです関数は FUNCTのように呼ばれている(KEY1 = {1,2,3}、KEY2 = {4,5}) paramsが欲しい渡されたFUNCTが渡された場合

[  
{ key1 : 1, key2 : 4 }, 
{ key1 : 2, key2 : 4}, 
{ key1 : 3, key2 : 4}, 
{ key1 : 1, key2 : 5 }, 
{ key1 : 2, key2 : 5}, 
{ key1 : 3, key2 : 5} 
] 

は同じように動作する必要があり、以下の任意の数のキー:セットのペア。

どうすれば実現できますか?ソリューションが簡単になればなるほど。

pythonを使用して3.5

ありがとうございます。

答えて

1

itertools.productは、この問題を解決するのに便利な方法です。

import itertools 


def dict_product(**kwargs): 
    """ 
    Cartesian product of kwargs as dicts with the same keys. 

    >>> p = list(dict_product(key1=[1, 2, 3], key2=[4, 5])) 
    >>> p.sort(key=lambda d: d['key1']) 
    >>> p == [ 
    ...  {'key1': 1, 'key2': 4}, 
    ...  {'key1': 1, 'key2': 5}, 
    ...  {'key1': 2, 'key2': 4}, 
    ...  {'key1': 2, 'key2': 5}, 
    ...  {'key1': 3, 'key2': 4}, 
    ...  {'key1': 3, 'key2': 5}, 
    ... ] 
    True 
    """ 
    items = kwargs.items() 
    keys = [key for key, value in items] 
    sets = [value for key, value in items] 

    for values in itertools.product(*sets): 
     yield dict(zip(keys, values)) 
関連する問題