我想通过一个列表循环检查每个项目对它后面的一个。

是否有一种方法可以在y中循环使用x的最后一项?如果可以的话,我宁愿不使用索引。

Note

freespace回答了我的实际问题,这就是为什么我接受了这个答案,但SilentGhost回答了我应该问的问题。

很抱歉造成了混乱。


当前回答

在迭代器中比较每一项而不实例化列表:

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

其他回答

for x in y[:-1]

如果y是一个生成器,那么上面的方法就行不通了。

如果你的意思是比较列表中的第n项和第n+1项,你也可以用

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

注意,这里没有硬编码。这应该是可以的,除非你有其他的感觉。

比较序列项的最简单方法如下:

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

这回答了OP应该问的问题,即遍历一个比较连续元素的列表(优秀的SilentGhost回答),但对于任何组(n-gram)都是广义的:2,3,…护士:

Zip (*(l[start:]用于起始范围(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:]从索引开始生成一个列表/生成器 *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