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

2024-05-19 21:55:55 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我试着用for循环来找出每两个对象之间的差异,方法是相互减去。 那么,如何在for循环中找到下一个值?

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

Tags: theto对象方法inforvalue差异
3条回答

需要注意的是,这些解决方案中的任何一个都不适用于发电机。为此,请参阅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来获取项目的索引。索引从0开始,因此指向上一个元素,因为我们循环一个项目。

另外,正如泰勒在评论中所指出的,如果您只想遍历这些差异,那么对于这样一个简单的问题,循环可能会过多。

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

我不知道你到底在看什么,但也许这能帮上忙:

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

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,

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

相关问题 更多 >