Как пропустить все, кроме последнего элемента списка?

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

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

Примечание

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

Извините за путаницу.

Ответ 1

for x in y[:-1]

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

Ответ 2

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

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)

Ответ 3

Если вы хотите получить все элементы в паре последовательностей, используйте этот подход (попарная функция из примеров в модуле 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])):

Ответ 4

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

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

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

Ответ 5

Это ответ на вопрос, который должен был задать 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, этот код такой же ленивый, как может быть. Не тестировалось.

Ответ 6

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

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