Как перебрать все, кроме последнего пункта списка? - PullRequest
133 голосов
/ 27 мая 2009

Я бы хотел просмотреть список, проверяя каждый элемент на соответствие следующему.

Есть ли способ, которым я могу перебрать все, кроме последнего элемента, использующего для x в y? Я бы предпочел сделать это без использования индексов, если смогу.

Примечание

freespace ответил на мой настоящий вопрос, поэтому я принял ответ, но SilentGhost ответил на вопрос, который я должен был задать.

Извиняюсь за путаницу.

Ответы [ 6 ]

263 голосов
/ 27 мая 2009
for x in y[:-1]

Если y является генератором, то вышеописанное не будет работать.

44 голосов
/ 27 мая 2009

Самый простой способ сравнить элемент последовательности со следующим:

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)
19 голосов
/ 27 мая 2009

Если вы хотите получить все элементы в последовательности последовательностей, используйте этот подход (парная функция из примеров в модуле itertools).

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

Если вам нужно сравнить последнее значение с каким-то особым значением, объедините это значение в конец

for current, next_item in pairwise(chain(y, [None])):
5 голосов
/ 27 мая 2009

, если вы хотите сравнить n-й элемент с n + 1-м элементом в списке, вы также можете сделать это с

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

обратите внимание, что там нет жесткого кодирования. Это должно быть хорошо, если вы не чувствуете иначе.

1 голос
/ 27 мая 2009

Чтобы сравнить каждый элемент со следующим в итераторе без создания списка:

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b
0 голосов
/ 03 декабря 2016

Это ответ на то, что OP должен был задать , то есть пройти по списку, сравнивая последовательные элементы (превосходный SilentGhost ответ), но обобщенный для любой группы ( n-грамм ): 2, 3, ... n:

zip(*(l[start:] for start in range(0, n)))

Примеры:

l = range(0, 4)  # [0, 1, 2, 3]

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []

Пояснения:

  • l[start:] генерирует список / генератор, начиная с индекса start
  • *list или *generator: передает все элементы функции включения zip, как если бы она была записана zip(elem1, elem2, ...)

Примечание:

AFAIK, этот код настолько ленив, насколько это возможно. Не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...