Python for 循环中如何找到下一个值(对象)?
你好,我正在尝试使用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))