在Python的for .. in循环中使用偏移量访问元素
我最近在玩Python,发现通常用这种方式
for x in SomeArray:
比起更像C语言的写法
for i in range(0, len(SomeArray)):
要更好(或者说更“Pythonic”)。我能理解这样做的好处,主要是代码更简洁,而且可以使用很方便的 map()
和相关的函数。不过,我经常会遇到一种情况,就是我想同时访问数组中不同位置的元素。比如,我可能想把当前元素和它前面两个位置的元素相加。有没有办法在不使用明确的索引的情况下做到这一点呢?
2 个回答
6
列表索引和zip()函数是你的好帮手。
下面是我对你更具体问题的回答:
我可能想把当前元素加到它前面两个位置的元素上。有没有办法在不使用明确索引的情况下做到这一点?
arr = range(10)
[i+j for i,j in zip(arr[:-2], arr[2:])]
如果你打算处理数字数组,还可以使用numpy这个模块。比如,上面的代码可以更优雅地写成:
import numpy
narr = numpy.arange(10)
narr[:-2] + narr[2:]
把第n个元素加到第(n-2)个元素上,相当于把第m个元素加到第(m+2)个元素上(对于数学感兴趣的人,我们进行了替换 n->m+2)。n的范围是[2, len(arr)),而m的范围是[0, len(arr)-2)。注意括号和圆括号的使用。0到len(arr)-3的元素(你排除了最后两个元素)用索引[:-2]表示,而从2到len(arr)-1的元素(你排除了前两个元素)用索引[2:]表示。
我假设你已经知道列表推导式。
15
在Python中,做到这一点的方法是:
for i, x in enumerate(SomeArray):
print i, x
enumerate
这个工具可以生成一系列的二元组,每个二元组里包含了数组的索引和对应的元素。