HI,我正在尝试使用for循环来找到每两个对象之间的差异,减去彼此。 那么,如何在for循环中找到下一个值呢?
for entry in entries:
first = entry # Present value
last = ?????? # The last value how to say?
diff = last = first
答案 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