嗨,我正在尝试使用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)
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)
编辑:我更改了生成器以省略没有先前值的第一个值,因为它更符合原始问题("找到相邻对之间的差异"),并且我添加了一个示例案例,表明它适用于无限重复的迭代器.
| 归档时间: |
|
| 查看次数: |
8561 次 |
| 最近记录: |