Как я циклично выполняюсь через список парами? [дубликат]

230
задан martineau 11 November 2017 в 11:41
поделиться

7 ответов

Вы можете использовать for in range с размером шага 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 вместо диапазона, потому что он более эффективен, поскольку генерирует повторяющийся объект, а не весь список.

345
ответ дан 23 November 2019 в 03:41
поделиться

Вы также можете использовать этот синтаксис ( 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), вторая - конечный индекс среза (по умолчанию - конец списка), а третья цифра - смещение или шаг.

84
ответ дан 23 November 2019 в 03:41
поделиться

Самым простым, на мой взгляд, является следующее:

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

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

44
ответ дан 23 November 2019 в 03:41
поделиться

Если вы используете Python 2.6 или новее, вы можете использовать рецепт группировщика из модуля 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 .

41
ответ дан 23 November 2019 в 03:41
поделиться
nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

Грязновато, но работает.

5
ответ дан 23 November 2019 в 03:41
поделиться

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

l=[1,2,3,4]

на:

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

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

for i,j in l:
    print i, j
-1
ответ дан 23 November 2019 в 03:41
поделиться

Это может быть не так быстро, как решение 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 на встроенную карту. Недостатком является то, что он не дает возможности настраивать значение заливки.

2
ответ дан 23 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

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