2016-03-29 15 views
2

Ich möchte einen Generator erstellen, der eine beliebige Anzahl von Schlüsselwortargumenten akzeptiert und das Produkt der Werte zurückgibt (geben Sie als Tupel wie unten gezeigt).Python: Erstellen unbekannter Anzahl von Variablen mit For-Schleife

Ich habe Probleme bei der Vermeidung der Hardcodierung der for-Schleife Variablen (hardcoded_a, hardcoded_b). In diesem Szenario, wenn ich mehr oder weniger als zwei Argumente verwende, gibt es eine ValueError. Es ist mir egal, ob ich die 'OK'-Variablen fest codiere. Wie kann ich darüber gehen, egal wie viele Gegenstände ich an Kwargs gebe, kann ich immer noch das Produkt liefern?

Das ist, was ich bisher geschrieben haben:

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

Was ist Ihr Ziel? multipliziere alle Werte von Kwargs? – Milor123

+0

Was sollte es in Ihrem Fall drucken? – Hetzroni

+0

@ Milor123 Ich möchte schließlich ein Wörterbuch der Kwargs-Schlüssel zu einem Wert ergeben, der sicherstellt, dass alle möglichen Werte abgedeckt werden – af3ld

Antwort

3

Ich denke, was Sie suchen ist die folgende:

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)) 

oder eine noch sauberere Lösung:

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

Perfekt, genau das versuche ich. Vielen Dank – af3ld

1

Wenn ich Ihr Ziel falsch verstehen, sollte die folgende Arbeiten:

from itertools import product 

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

Beispiel:

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

Es ist erwähnenswert, Es ist jedoch nicht garantiert, dass kwargs.values() eine bestimmte Reihenfolge hat. Dies wird sicherstellen, dass sie durch die „natürliche Ordnung“ (String-Vergleich) der Keywords geordnet:

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

So jetzt:

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