Как я объединяю два итератора Python?

Кажется, что вы хотите напечатать индекс элемента массива, который находится в индексе 2. Вы можете сделать это следующим образом:

std::cout << 2;
21
задан David Eyk 28 October 2008 в 16:07
поделиться

10 ответов

Генератор решит Вашу проблему приятно.

def imerge(a, b):
    for i, j in itertools.izip(a,b):
        yield i
        yield j
38
ответ дан 29 November 2019 в 06:10
поделиться

Можно сделать что-то, что является почти exaclty что @Pramod, сначала предложенный.

def izipmerge(a, b):
  for i, j in itertools.izip(a,b):
    yield i
    yield j

преимущество этого подхода состоит в том, что у Вас не закончится память, если и a и b будут бесконечны.

15
ответ дан 29 November 2019 в 06:10
поделиться

Я также соглашаюсь, что itertools не нужен.

, Но почему остановка в 2?

  def tmerge(*iterators):
    for values in zip(*iterators):
      for value in values:
        yield value

ручки любое количество iterators от 0 на вверх.

ОБНОВЛЕНИЕ: DOH! Комментатор указал, что это не будет работать, если все iterators не будут той же длиной.

правильный код:

def tmerge(*iterators):
  empty = {}
  for values in itertools.izip_longest(*iterators, fillvalue=empty):
    for value in values:
      if value is not empty:
        yield value

и да, я просто попробовал его списками неравной длины и списком, содержащим {}.

11
ответ дан 29 November 2019 в 06:10
поделиться

Я сделал бы что-то вроде этого. Это будет большей частью эффективного времени и пространства, так как у Вас не будет издержек архивирования объектов вместе. Это будет также работать, если и a и b будут бесконечны.

def imerge(a, b):
    i1 = iter(a)
    i2 = iter(b)
    while True:
        try:
            yield i1.next()
            yield i2.next()
        except StopIteration:
            return
10
ответ дан 29 November 2019 в 06:10
поделиться

Можно использовать zip, а также itertools.chain. Это будет только работа , если первый список будет конечен :

merge=itertools.chain(*[iter(i) for i in zip(['foo', 'bar'], itertools.count(1))])
8
ответ дан 29 November 2019 в 06:10
поделиться

Я не уверен, каково Ваше приложение, но Вы могли бы найти перечисление () функция более полезный.

>>> items = ['foo', 'bar', 'baz']
>>> for i, item in enumerate(items):
...  print item
...  print i
... 
foo
0
bar
1
baz
2
3
ответ дан 29 November 2019 в 06:10
поделиться

Используйте izip и цепочку вместе:

>>> list(itertools.chain.from_iterable(itertools.izip(items, c))) # 2.6 only
['foo', 1, 'bar', 2]

>>> list(itertools.chain(*itertools.izip(items, c)))
['foo', 1, 'bar', 2]
1
ответ дан 29 November 2019 в 06:10
поделиться

Почему itertools необходим?

def imerge(a,b):
    for i,j in zip(a,b):
        yield i
        yield j

В этом случае по крайней мере один из a или b должен иметь конечную длину, zip причины возвратит список, не итератор. При необходимости в итераторе, как произведено тогда, можно пойти для решения Claudiu.

0
ответ дан 29 November 2019 в 06:10
поделиться

Используя itertools.izip (), вместо почтового индекса () как в некоторых из других ответов, улучшит производительность:

Как «pydoc itertools.izip» показы: «Работы как почтовый индекс () функционируют, но потребляет меньше памяти, возвращая iterator вместо списка».

Itertools.izip будет также работать правильно, даже если один из iterators будет бесконечен.

0
ответ дан 29 November 2019 в 06:10
поделиться

Краткий метод должен использовать выражение генератора с itertools.cycle (). Это старается не создавать длинную цепочку () кортежей.

generator = (it.next() for it in itertools.cycle([i1, i2]))
0
ответ дан 29 November 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: