Как прокрутить список по двум?

Возможный дубликат:
Каков самый "питонический" способ перебора списка в кусках?

Я хочу циклически перебирать список Python и обрабатывать 2 элемента списка за раз. Что-то вроде этого на другом языке:

for(int i = 0; i < list.length(); i+=2)
{
   // do something with list[i] and list[i + 1]
}

Какой лучший способ выполнить это?

Ответ 1

Вы можете использовать диапазон в диапазоне с размером шага 2:

Python 2

for i in xrange(0,10,2):
  print(i)

Python 3

for i in range(0,10,2):
  print(i)

Примечание. Используйте xrange в Python 2 вместо диапазона, потому что он более эффективен, так как он генерирует итерируемый объект, а не весь список.

Ответ 2

Вы также можете использовать этот синтаксис (L[start:stop:step]):

mylist = [1,2,3,4,5,6,7,8,9,10]
for i in mylist[::2]:
    print i,
# prints 1 3 5 7 9

for i in mylist[1::2]:
    print i,
# prints 2 4 6 8 10

Если первая цифра является начальным индексом (по умолчанию - начало списка или 0), второй заканчивает индекс среза (по умолчанию - конец списка), а третья цифра - это смещение или шаг.

Ответ 3

Если вы используете Python 2.6 или новее, вы можете использовать grouper recipe из itertools:

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

Вызов:

for item1, item2 in grouper(2, l):
    # Do something with item1 and item2

Обратите внимание, что в Python 3.x вы должны использовать zip_longest вместо izip_longest.

Ответ 4

Самый простой, на мой взгляд, это только:

it = iter([1,2,3,4,5,6])
for x, y in zip(it, it):
    print x, y

Никаких дополнительных импортов или чего-либо еще. И очень элегантный, на мой взгляд.

Ответ 5

nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

Нездоровый, но он работает.

Ответ 6

Это может быть не так быстро, как решение izip_longest (на самом деле я его не тестировал), но он будет работать с python < 2.6 (izip_longest был добавлен в 2.6):

from itertools import imap

def grouper(n, iterable):
    "grouper(3, 'ABCDEFG') --> ('A,'B','C'), ('D','E','F'), ('G',None,None)"
    args = [iter(iterable)] * n

    return imap(None, *args)

Если вам нужно идти раньше 2.3, вы можете заменить встроенную карту для imap. Недостатком является то, что он не дает возможности настраивать значение заливки.

Ответ 7

Если у вас есть контроль над структурой списка, самой пифонической задачей, вероятно, будет его изменение:

l=[1,2,3,4]

в

l=[(1,2),(3,4)]

Тогда ваш цикл будет:

for i,j in l:
    print i, j