Ответ 1
for x in y[:-1]
Если y
является генератором, то указанное выше не будет работать.
Я хотел бы пройти через список, проверяющий каждый элемент по отношению к следующему ему.
Есть ли способ, которым я могу прокручивать все, кроме последнего элемента, используя для x в y? Я бы предпочел сделать это, не используя индексы, если смогу.
Примечание
freespace ответил на мой реальный вопрос, поэтому я принял ответ, но SilentGhost ответил на вопрос, который я должен был задать.
Извините за путаницу.
for x in y[:-1]
Если y
является генератором, то указанное выше не будет работать.
Самый простой способ сравнить элемент последовательности со следующим:
for i, j in zip(a, a[1:]):
# compare i (the current) to j (the following)
Если вы хотите получить все элементы в паре последовательностей, используйте этот подход (попарная функция из примеров в модуле 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])):
если вы хотите сравнить n-й элемент с n + 1-м элементом в списке, который вы также можете сделать с помощью
>>> for i in range(len(list[:-1])):
... print list[i]>list[i+1]
Заметьте, что там нет жесткого кодирования. Это должно быть хорошо, если вы не чувствуете иначе.
Это ответ на вопрос, который должен был задать 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, этот код такой же ленивый, как может быть. Не тестировалось.
Чтобы сравнить каждый элемент со следующим в итераторе без создания экземпляра списка:
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