Python for 循环中如何找到下一个值(对象)?

3 投票
4 回答
9612 浏览
提问于 2025-04-16 05:27

你好,我正在尝试使用for循环来找出每两个对象之间的差异,也就是通过相减来实现。那么,在for循环中,我该如何找到下一个值呢?

for entry in entries:
    first = entry      # Present value
    last = ??????      # The last value how to say?
    diff = last = first

4 个回答

1

我不太清楚你具体在找什么,但也许这个对你有帮助:

first = entries[0]
for entry in entries[1:]:
    last = entry       
    diff = last - first 
    first = entry
6

zip这个函数可以用在列表上,但如果我们想处理更一般的情况:

def pairs(it):
    it = iter(it)
    prev = next(it)
    for v in it:
        yield prev, v
        prev = v

a = [1,2,3,4,5]
for prev, cur in pairs(a):
    print cur - prev

import itertools as it
for prev, cur in pairs(it.cycle([1,2,3,4])):
    print cur - prev

这个方法对于大容器(比如大列表)运行得很高效,更重要的是,它也适用于迭代器:

for prev, cur in pairs(open("/usr/share/dict/words").xreadlines()):
    print cur, prev,

补充说明:我修改了生成器,去掉了第一个没有前一个值的项,因为这样更符合原来的问题(“找出相邻两个数之间的差”),我还添加了一个示例,展示它如何在一个无限重复的迭代器上工作。

12

需要注意的是,这些解决方案都不适用于生成器。如果你想了解更好的解决办法,可以看看Glenn Maynard的方案。

对于小列表,可以使用zip:

 for current, last in zip(entries[1:], entries):
     diff = current - last

这个方法会复制列表(并从两个列表的副本中生成一个元组列表),所以如果处理较大的列表,使用itertools会更好。

import itertools as it

items = it.izip(it.islice(entries, 1, None), entries)
for current, last in items:
    diff = current - last

这样做可以避免同时复制列表和生成元组列表。

还有一种不复制列表的方法是:

entry_iter = iter(entries)
entry_iter.next() # Throw away the first version
for i, entry in enumerate(entry_iter):
    diff = entry - entries[i]

另外还有一种方法是:

for i in xrange(len(entries) - 1):
    diff = entries[i+1] - entries[i]

这个方法创建了一个迭代器,用来索引entries,并将其向前移动一个位置。然后它使用enumerate来获取带有索引的项目。索引从0开始,所以它指向前一个元素,因为我们在循环中向前移动了一项。

另外,正如Tyler在评论中提到的,如果你只是想遍历差异,使用循环可能有点过于复杂了。

diffs = (current - last for current, last in 
         it.izip(it.islice(entries, 1, None), entries))

撰写回答