2013-06-26 3 views
0

У меня есть список списков и вы хотите получить итератор над каждым элементом в каждом списке.Итератор python по нескольким спискам

Моя идея написать класс с двумя переменными: итератор по спискам и итерация по текущему внутреннему списку. Всякий раз, когда внутренний итератор списка вызывает StopIteration, я вызываю следующий в итераторе внешнего списка. Мой способ сделать это содержит много вложенных ifs в следующей функции, поэтому я спрашиваю вас, что такое пифонический способ сделать это.

Пример:

lists = [[1, 2].__iter__(), [3, 4].__iter__()] 

Теперь мне нужен объект итератора, через 1, 2, 3 и 4. Поскольку Лист я работаю с очень большим, я могу использовать только итераторы.

+1

Вы просите [ 'itertools.chain'] (http://docs.python.org/2/library/itertools.html#itertools.chain)? – BrenBarn

+0

Я не совсем понимаю. Отправьте код, который у вас есть. –

ответ

4

Использование itertools.chain.from_iterable():

from itertools import chain 

for elem in chain.from_iterable(nested_list): 

Демо:

>>> from itertools import chain 
>>> nested_list = [['a', 'b'], ['c', 'd']] 
>>> for elem in chain.from_iterable(nested_list): 
...  print elem, 
... 
a b c d 
1

Использование izip: izip(*nested) или просто 'почтовый', если ваш на Python 3.x

Оператор * распаковка аргумент оператора, и позволяет кортеж или список «распространяться» через операторы. Другим примером этого является:

list = (1, 2, 3, 4, 5) 

a, *bcd, e = list # a=1, bcd=[2,3,4] and e=5 
Смежные вопросы