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

时间:2009-05-27 08:59:36

标签: python

我想循环检查每个项目的列表与其后面的项目。

有没有办法可以在y中使用for x循环除最后一项以外的所有项目?如果可以的话,我宁愿不使用索引。

注意

freespace回答了我的实际问题,这就是我接受答案的原因,但是SilentGhost回答了我应该问的问题。

为混乱道歉。

7 个答案:

答案 0 :(得分:262)

for x in y[:-1]

如果y是生成器,则上述操作无效。

答案 1 :(得分:44)

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

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

答案 2 :(得分:19)

如果要获得序列对中的所有元素,请使用此方法(成对函数来自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])):

答案 3 :(得分:5)

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

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

请注意,那里没有硬编码。除非你有其他想法,否则这应该没问题。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

这回答了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,这段代码尽可能地懒惰。未经测试。

答案 6 :(得分:0)

我知道你了。假设这是您的列表 categoricals ,其中包含您要迭代的列的名称,但最后一列 ReversedPayment 除外。

categoricals = ['SeniorCitizen','CollegeDegree','Married','FulltimeJob','ReversedPayment']

像下面这样编写您的 for 循环,这应该会为您提供所需的内容。

for i in categoricals[:-1]:
print(i)