【问题标题】:Accessing elements with offsets in Python's for .. in loops在 Python 的 for .. in 循环中访问具有偏移量的元素
【发布时间】:2010-11-19 21:15:43
【问题描述】:

我一直在研究 Python,我发现它通常更好用(或“pythonic”)

for x in SomeArray:

而不是更多的 C 风格

for i in range(0, len(SomeArray)):

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

【问题讨论】:

  • 注意 range(0, len(SomeArray)) 等价于更常见的 range(len(SomeArray))。

标签: python loops


【解决方案1】:

在 Python 中这样做的方法是:

for i, x in enumerate(SomeArray):
    print i, x

enumerate 生成器生成一个 2 元组序列,每个元组包含数组索引和元素。

【讨论】:

  • 但是如何在循环的一次迭代中访问先前/后续元素?
  • 在循环内部,可以访问 SomeArray[i-1] 或 SomeArray[i+1]。
  • SomeArray[i-1]?但你可能想解释一下你实际上在做什么
  • 由于您在i 中拥有当前元素的索引,因此您可以通过从i 中添加或减去一些偏移量来访问它周围的元素,并访问该位置的元素。
【解决方案2】:

列表索引和 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:]。

我假设你已经知道列表推导。

【讨论】:

  • 是的,我知道列表推导。虽然还没有真正使用过它们。 zip() 看起来是另一个不错的解决方案,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2011-06-20
  • 2010-09-21
相关资源
最近更新 更多