如何遍历列表中除最后一项以外的所有内容?


160

我想遍历一个列表,将每个项目与它后面的项目进行对照。

有没有一种方法可以遍历除最后一项以外的所有项,以便在y中使用x?如果可以的话,我宁愿不使用索引就这样做。

注意

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

抱歉造成混乱。

Answers:


316
for x in y[:-1]

如果y是发电机,则以上操作将无效。


谢谢,这回答了我的问题,但是我忘了问x之后我将如何得到该物品。这可能吗?
David Sykes,

3
-1我认为无法回答问题。它没有将每个项目与下一个进行比较。– odwl 0秒前
odwl

4
我想我做到了。作者说他想做X,然后问他怎么做Y。我回答了他怎么做Y。他接受我的回答就表示我回答了他所问的问题,如果不是他真正想问的问题。欢迎Asker降级此答案。
自由空间

7
仅仅因为OP应该首先问另一个问题,并不意味着他的问题和这个答案对其他人不是很有用。+1
Falken教授2012年

1
您提到这不适用于发电机。什么y是发电机?
Joost

50

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

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

15
这回答了我希望提出的问题。谢谢
戴维·赛克斯

3
实际上,您可以省略第一个片段,因为zip会将较长的列表截断为较短的列表。这将为您节省一个列表创建。(以防万一,如果您要处理大量列表。但是,在这种情况下,您应该遵循Ants Aasma的方法,该方法不会复制任何内容。)
拜耳,2009年

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])):

请注意,将next用于内置的变量名称阴影
SilentGhost

1
我个人不介意在变量的范围较小且名称易于读取的情况下隐藏较少使用的内置函数。但是,编辑了变量名以保持良好的编码习惯。
蚂蚁阿斯玛09年

5

如果您要比较列表中的第n个项目和第n + 1个项目,则也可以使用

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

请注意,那里没有硬编码。除非您另有感觉,否则应该可以。


3
您可以将len(list [:-1])替换为len(list)-1以避免列表复制。并避免使用名为list的变量...
Remy Blank

2

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

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

2
这正是被蚂蚁Aasma建议stackoverflow.com/questions/914715/...
SilentGhost

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,此代码尽可能地懒惰。未经测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.