2016-03-29 15 views
2

キーワード引数を任意の数で取得し、値の積を返すジェネレータを作成します(以下に示すようにタプルとして与える)。Python:forループを使用して未知数の変数を作成する

forループ変数(hardcoded_ahardcoded_b)のハードコーディングを回避するのに問題があります。このシナリオでは、2つ以上の引数を使用すると、ValueErrorとなります。私は '大丈夫'変数をハードコーディングしても構いません。どのように多くのアイテムを私がkwargsに渡しても、私はまだ製品を得ることができますか?

これは私がこれまでに書かれたものです:私はあなたの目的は、以下が動作するはず誤解しない限り

from itertools import product 
def gen(**kwargs): 
    options = {} 
    [options.update({k: v}) for k, v in kwargs.iteritems()] 
    for hardcoded_a, hardcoded_b in product(*(tuple(options.values()))): 
     yield hardcoded_a, hardcoded_b 

for okay_var1, okay_var2 in gen(dollar=(2, 20), hungry=(True, False)): 
    print okay_var1, okay_var2 
+1

あなたの目的は何ですか? kwargsのすべての値を掛ける? – Milor123

+0

あなたの場合、どのように印刷する必要がありますか? – Hetzroni

+0

@ Milor123最終的にkwargsキーの辞書を、すべての可能な値をカバーするように値に設定したい – af3ld

答えて

3

私はあなたが探しているものだと思うには、以下である:だから今

def gen2(**kwargs): 
    return product(*map(lambda t:t[1],sorted(k.items()))) 

:これは、キーワードの(文字列比較)彼らは「自然順序付け」が発注されていることを確認します。

def gen(**kwargs): 
    options = {} 
    [options.update({k: v}) for k, v in kwargs.iteritems()] 
    for prod in product(*(tuple(options.values()))): 
     yield dict(zip(options, prod)) 

あるいはクリーナーソリューション:

def gen(**kwargs): 
    for prod in product(*kwargs.values()): 
     yield dict(zip(kwargs, prod)) 
+0

これはまさに私がやろうとしていることです。ありがとう – af3ld

1

を:

from itertools import product 

def gen(**kwargs): 
    return product(*kwargs.values()) 

例:

>>> print(list(gen(dollar=(2,20), hungry=(True,False)))) 
[(True, 2), (True, 20), (False, 2), (False, 20)] 

それは注目に値しますただし、kwargs.values()は特定の注文を保障されていません。

>>> print(list(gen2(dollar=(2,20), hungry=(True,False)))) 
[(2, True), (2, False), (20, True), (20, False)] 
関連する問題