Вопрос-Ответ

Iterating over every two elements in a list [duplicate]

Перебор каждых двух элементов в списке

Как мне создать for цикл или понимание списка, чтобы каждая итерация давала мне два элемента?

l = [1,2,3,4,5,6]

for i,k in ???:
print str(i), '+', str(k), '=', str(i+k)

Вывод:

1+2=3
3+4=7
5+6=11
Переведено автоматически
Ответ 1

Вам нужна pairwise() (или grouped()) реализация.

def pairwise(iterable):
"s -> (s0, s1), (s2, s3), (s4, s5), ..."
a = iter(iterable)
return zip(a, a)

for x, y in pairwise(l):
print("%d + %d = %d" % (x, y, x + y))

Или, в более общем смысле:

def grouped(iterable, n):
"s -> (s0,s1,s2,...sn-1), (sn,sn+1,sn+2,...s2n-1), (s2n,s2n+1,s2n+2,...s3n-1), ..."
return zip(*[iter(iterable)]*n)

for x, y in grouped(l, 2):
print("%d + %d = %d" % (x, y, x + y))

В Python 2 вам следует импортировать izip в качестве замены встроенной в Python 3 zip() функции.

Вся заслуга Мартино за его ответ на мой вопрос, я обнаружил, что это очень эффективно, поскольку оно выполняет итерацию по списку только один раз и не создает никаких ненужных списков в процессе.

Примечание: Это не следует путать с pairwise рецептом из собственной itertools документации Python, который дает результат s -> (s0, s1), (s1, s2), (s2, s3), ..., как указал @lazyr в комментариях.

Небольшое дополнение для тех, кто хотел бы выполнить проверку типов с помощью mypy на Python 3:

from typing import Iterable, Tuple, TypeVar

T = TypeVar("T")

def grouped(iterable: Iterable[T], n=2) -> Iterable[Tuple[T, ...]]:
"""s -> (s0,s1,s2,...sn-1), (sn,sn+1,sn+2,...s2n-1), ..."""
return zip(*[iter(iterable)] * n)
Ответ 2

Ну, вам нужен кортеж из 2 элементов, так что

data = [1,2,3,4,5,6]
for i,k in zip(data[0::2], data[1::2]):
print str(i), '+', str(k), '=', str(i+k)

Где:


  • data[0::2] означает создание подмножества элементов, которое (index % 2 == 0)

  • zip(x,y) создает коллекцию кортежей из коллекций x и y одинаковых индексных элементов.

Ответ 3
>>> l = [1,2,3,4,5,6]

>>> zip(l,l[1:])
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

>>> zip(l,l[1:])[::2]
[(1, 2), (3, 4), (5, 6)]

>>> [a+b for a,b in zip(l,l[1:])[::2]]
[3, 7, 11]

>>> ["%d + %d = %d" % (a,b,a+b) for a,b in zip(l,l[1:])[::2]]
['1 + 2 = 3', '3 + 4 = 7', '5 + 6 = 11']
Ответ 4

Простое решение.

l = [1, 2, 3, 4, 5, 6]

для i в диапазоне (0, len(l), 2):
выведите str(l[i]), '+', str(l[i + 1]), '=', str(l[i] + l[i + 1])
python list