Кажется, что вы хотите напечатать индекс элемента массива, который находится в индексе 2. Вы можете сделать это следующим образом:
std::cout << 2;
Генератор решит Вашу проблему приятно.
def imerge(a, b):
for i, j in itertools.izip(a,b):
yield i
yield j
Можно сделать что-то, что является почти exaclty что @Pramod, сначала предложенный.
def izipmerge(a, b):
for i, j in itertools.izip(a,b):
yield i
yield j
преимущество этого подхода состоит в том, что у Вас не закончится память, если и a и b будут бесконечны.
Я также соглашаюсь, что 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
и да, я просто попробовал его списками неравной длины и списком, содержащим {}.
Я сделал бы что-то вроде этого. Это будет большей частью эффективного времени и пространства, так как у Вас не будет издержек архивирования объектов вместе. Это будет также работать, если и a
и b
будут бесконечны.
def imerge(a, b):
i1 = iter(a)
i2 = iter(b)
while True:
try:
yield i1.next()
yield i2.next()
except StopIteration:
return
Можно использовать zip
, а также itertools.chain
. Это будет только работа , если первый список будет конечен :
merge=itertools.chain(*[iter(i) for i in zip(['foo', 'bar'], itertools.count(1))])
Я не уверен, каково Ваше приложение, но Вы могли бы найти перечисление () функция более полезный.
>>> items = ['foo', 'bar', 'baz']
>>> for i, item in enumerate(items):
... print item
... print i
...
foo
0
bar
1
baz
2
Используйте 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]
Почему itertools необходим?
def imerge(a,b):
for i,j in zip(a,b):
yield i
yield j
В этом случае по крайней мере один из a или b должен иметь конечную длину, zip причины возвратит список, не итератор. При необходимости в итераторе, как произведено тогда, можно пойти для решения Claudiu.
Используя itertools.izip (), вместо почтового индекса () как в некоторых из других ответов, улучшит производительность:
Как «pydoc itertools.izip» показы: «Работы как почтовый индекс () функционируют, но потребляет меньше памяти, возвращая iterator вместо списка».
Itertools.izip будет также работать правильно, даже если один из iterators будет бесконечен.
Краткий метод должен использовать выражение генератора с itertools.cycle (). Это старается не создавать длинную цепочку () кортежей.
generator = (it.next() for it in itertools.cycle([i1, i2]))