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

use*_*652 3 python for-loop

嗨,我正在尝试使用for循环找到每两个对象之间的差异减去彼此.那么,如何在for循环中找到下一个值呢?

for entry in entries:
    first = entry      # Present value
    last = ??????      # The last value how to say?
    diff = last = first
Run Code Online (Sandbox Code Playgroud)

aar*_*ing 12

应该注意的是,这些解决方案都不适用于发电机.为此,请参阅Glenn Maynards的优秀解决方案.

使用zip作为小列表:

 for current, last in zip(entries[1:], entries):
     diff = current - last
Run Code Online (Sandbox Code Playgroud)

这会生成列表的副本(以及列表的两个副本中的元组列表),因此最好使用itertools来处理更大的列表

import itertools as it

items = it.izip(it.islice(entries, 1, None), entries)
for current, last in items:
    diff = current - last
Run Code Online (Sandbox Code Playgroud)

这将避免制作列表的副本制作元组列表.

另一种不制作副本的方法是

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

而另一种方式是:

for i in xrange(len(entries) - 1):
    diff = entries[i+1] - entries[i]
Run Code Online (Sandbox Code Playgroud)

这将创建一个迭代器,将其索引entries并前进一个.然后它enumerate用来获得项目的指示.indice从0开始,因此指向前一个元素,因为我们循环了一个项目.

另外,正如Tyler在评论中指出的那样,如果你只想迭代这些差异,那么循环对于这样一个简单的问题可能是过度的.

diffs = (current - last for current, last in 
         it.izip(it.islice(entries, 1, None), entries))
Run Code Online (Sandbox Code Playgroud)


Gle*_*ard 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
Run Code Online (Sandbox Code Playgroud)

这适用于大型容器,更重要的是,它适用于迭代器:

for prev, cur in pairs(open("/usr/share/dict/words").xreadlines()):
    print cur, prev,
Run Code Online (Sandbox Code Playgroud)

编辑:我更改了生成器以省略没有先前值的第一个值,因为它更符合原始问题("找到相邻对之间的差异"),并且我添加了一个示例案例,表明它适用于无限重复的迭代器.