2016-03-29 4 views
2

Я хочу создать генератор, который принимает любое количество аргументов ключевого слова и возвращает произведение значений (дайте в виде кортежей, как показано ниже).Python: создание неизвестного числа переменных с помощью for-loop

У меня возникли проблемы с тем, чтобы избежать жесткого кодирования переменных цикла цикла (hardcoded_a, hardcoded_b). В этом случае, если я использую более или менее двух аргументов, он дает ValueError. Меня не волнует жесткая кодировка переменных «okay». Как я могу это сделать, независимо от того, сколько предметов я перехожу в 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 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() не гарантируется определенный заказ. Это позволит убедиться, что они упорядочены по «естественному порядку» (сравнение строк) ключевых слов:

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

Итак:

>>> print(list(gen2(dollar=(2,20), hungry=(True,False)))) 
[(2, True), (2, False), (20, True), (20, False)] 
Смежные вопросы