在Python中访问具有偏移量的元素,用于... in循环

int*_*nt3 9 python loops

我一直在用Python捣乱,我收集到它通常更好(或'pythonic')使用

for x in SomeArray:
Run Code Online (Sandbox Code Playgroud)

而不是更多的C风格

for i in range(0, len(SomeArray)):
Run Code Online (Sandbox Code Playgroud)

我确实看到了这方面的好处,主要是更清晰的代码,以及使用漂亮map()和相关功能的能力.但是,我经常遇到这样的情况:我想同时访问数组中不同偏移的元素.例如,我可能想要将当前元素添加到元素后面两步.有没有办法在不诉诸显式指数的情况下做到这一点?

Gre*_*ill 15

在Python中执行此操作的方法是:

for i, x in enumerate(SomeArray):
    print i, x
Run Code Online (Sandbox Code Playgroud)

所述enumerate发生器产生的2元组序列,每个包含数组索引和元件.


Chr*_*lis 6

列表索引和zip()是你的朋友.

以下是您更具体问题的答案:

我可能想要将当前元素添加到元素后面两步.有没有办法在不诉诸显式指数的情况下做到这一点?

arr = range(10)
[i+j for i,j in zip(arr[:-2], arr[2:])]
Run Code Online (Sandbox Code Playgroud)

如果您打算处理数值数组,也可以使用模块numpy.例如,上面的代码可以更优雅地编写为:

import numpy
narr = numpy.arange(10)
narr[:-2] + narr[2:]
Run Code Online (Sandbox Code Playgroud)

将第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:].

我假设你已经知道列表理解.