Как прокрутить список по двум?
Возможный дубликат:
Каков самый "питонический" способ перебора списка в кусках?
Я хочу циклически перебирать список 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