2016-03-29 17 views
2

Herhangi bir sayıda anahtar kelime argümanını alan bir üretici oluşturmak istiyorum ve bu değerlerin ürününü döndürecektir (aşağıda gösterildiği gibi tuple verin).Python: Döngüyü kullanarak bilinmeyen sayıda değişken oluşturma

Döngü değişkenleri için kodlamayı önlemekte sorun yaşıyorum (hardcoded_a, hardcoded_b). Bu senaryoda ikiden fazla bağımsız değişken kullanırsam ValueError verir. 'Tamam' değişkenlerini kodlamayı umursamıyorum. Bu konuda nasıl gidebilirim ki kaç tane eşyaya geçersem gideyim, ürünü hala alabilirim? Ben senin amacın yanlış anlamak sürece

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

Amacınız nedir? kwargs'ın tüm değerlerini çarpar mı? – Milor123

+0

Vakanızda ne yazmalı? – Hetzroni

+0

@ Milor123 Kwargs anahtarlarının bir sözlüğünü olası tüm değerleri kapsadığından emin olmak için bir değer vermek istiyorum – af3ld

cevap

3

Ne aradığınızı düşünüyorum şudur: Yani şimdi

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

: Bu anahtar kelimelerin (string karşılaştırma) onlar "doğal sıralama" göre sıralanır sağlayacağız:

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

veya daha temiz bir çözüm:

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

Mükemmel, tam olarak yapmaya çalıştığım şey budur. Teşekkürler – af3ld

1

aşağıdaki çalışması gerekir:

Bu

şimdiye kadar yazdım budur

from itertools import product 

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

Örnek:

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

Bu kayda değer Ancak, kwargs.values()'un belirli bir sıraya sahip olması garanti edilmez.

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