关于python:如何遍历除列表的最后一项之外的所有项目?

How to loop through all but the last item of a list?

我想循环查看一个列表,对照后面的项目检查每个项目。

有没有一种方法可以循环遍历除了最后一个用于y中x的项之外的所有项?如果可以的话,我宁愿不使用索引。

注释

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

为困惑道歉。


1
for x in y[:-1]

如果y是一个发电机,那么上述功能将不起作用。


将序列项与以下项进行比较的最简单方法:

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


如果您想获取序列对中的所有元素,请使用这种方法(pair wise函数来自itertools模块中的示例)。

1
2
3
4
5
6
7
8
9
10
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

如果需要将最后一个值与某个特殊值进行比较,请将该值链接到末尾

1
for current, next_item in pairwise(chain(y, [None])):


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

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

注意这里没有进行硬编码。这应该没问题,除非你另有感觉。


要在不实例化列表的情况下将每个项与迭代器中的下一个项进行比较,请执行以下操作:

1
2
3
4
5
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


这回答了操作人员应该问的问题,即遍历一个比较连续元素的列表(优秀的silentghost答案),但对任何组(n-gram):2,3,……n

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

实例:

1
2
3
4
5
6
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, ...)一样。

注:

阿法克,这段代码是最懒惰的。未测试。