2014-01-24 4 views
-1

Мне нужно сгенерировать функцию, которая принимает любое количество последовательностей и возвращает список кортежей. Я пытался писать код для генерации кортежей один за другим через генераторы из списка, используя следующий код:Python - для возврата генератора последовательностей

>>> gen1 = [(x,y) for x in range(3) for y in range(4)] 
>>> gen1 
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)] 
>>> iter1 = iter(gen1) 
>>> iter1.next() 
>>> def gen3(): 
...  yield iter1.next() 
... 
>>> next(gen3()) 

Который дает кортежи. Но мне нужно применить тот же код в следующей функции, которая содержит множество последовательностей параметров:

def generator_zip(seq1, seq2, *more_seqs): 

Как я могу использовать приведенный выше код в этой функции ??

+1

Кстати, вы использовали слово «Фитон» в каждом вопросе вы спросил и никогда не добавлял тэг [python]. Язык называется «Python», а не «Phyton», и если вы не помечаете правильно, у вас будет много проблем с получением помощи. – geoffspear

+1

Есть ли причина, по которой вы изобретаете эту функциональность? Он уже существует в 'itertools.izip'. –

+0

Это больше похоже на itertools.product, чем itertools.izip –

ответ

2

Я думаю itertools.product является то, что вы ищете

import itertools 

print list(itertools.product(range(3), range(4))) 

>> [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), 
>> (2, 0), (2, 1), (2, 2), (2, 3)] 

print list(itertools.product(range(2), range(3), range(4))) 

>> [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), 
>> (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), 
>> (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 1, 0), (1, 1, 1), 
>> (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3)] 

Обратите внимание, что itertools функция всегда возвращает генераторы

+0

Я не могу использовать функции itertools, но я могу использовать реализацию izip. Но , не может получить его. @ Icfseth – Ramya

+0

это не очень сложно на самом деле. A x B x C = (A x B) x C = AB x C = ABC. Используя итеративный подход, вы можете присоединиться к первым двум спискам в один список и продолжать делать это до тех пор, пока у вас не будет одного списка. –

+0

Я думаю, что iZip реализован на C для скорости, вы, скорее всего, не найдете его код на Python. –

Смежные вопросы