如何循环遍历列表中的最后一项?

我想通过一个列表检查每个项目跟随它的一个循环。

有没有办法,我可以遍历所有,但最后的项目使用X在Y? 如果可以的话,我宁愿不使用索引。

注意

自由空间回答了我的实际问题,这就是为什么我接受了答案,但是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-gram )都是泛化的: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,这个代码是懒惰的,因为它可以。 没有testing。

在迭代器中比较每个项目和下一个项目,而不用实例化一个列表:

 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