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

时间:2010-10-14 00:08:42

标签: python for-loop

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

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

4 个答案:

答案 0 :(得分:12)

应该注意,这些解决方案的 none 适用于生成器。为此,请参阅Glenn Maynards的优秀解决方案。

将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来获得项目的指示。 indice从0开始,因此指向前一个元素,因为我们循环了一个项目。

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

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

答案 1 :(得分: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,

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

答案 2 :(得分:1)

非常简单,使用枚举,没有花哨的东西

>>> entries=[10,20,30,40]
>>> for n,i in enumerate(entries):
...     try:
...        print entries[n+1] - i
...     except IndexError:
...        print entries[-1]
...
10
10
10
40

答案 3 :(得分:1)

我不确切地知道你在寻找什么,但也许这可能有所帮助:

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