0

for x in y:遍历列表的 Python 语法必须以某种方式记住指针当前所在的元素是正确的?当我试图解决这个问题而不诉诸于 for index, x in enumerate(y):

我想这样做的技术原因是我假设enumerate()在以某种方式访问​​已经存在的“指针”时会降低性能。我从答案中看到,但是这个指针非常私密且无法访问。

我想这样做的功能原因是如果当前元素浮点值远离“所需”浮点范围,则能够跳过例如 100 个元素。

- 回答 -

解决方法如下(纯示意图示例):

# foo is assumed to be ordered in this example
foo = [1,2,3,4,5,6....,99,100]
low = 60
high = 70
z = iter(foo)
for x in z:
    if x < low-10
        next(islice(z,10,10),None)
    if x > high
        break
4

4 回答 4

7

你不能。for使用Python 迭代协议,这对于列表意味着它将创建一个私有迭代器对象。该对象跟踪列表中的位置。

即使您要使用 显式创建迭代器iter(),当前位置也不是该对象的公共属性:

>>> list_iter = iter([])
>>> list_iter
<listiterator object at 0x10056a990>
>>> dir(list_iter)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__length_hint__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'next']

迭代协议的重点在于,它可以让您以完全相同的方式处理任何序列,甚至是无限继续的序列。创建一个没有位置的序列生成器很简单:

def toggle():
    while True:
        yield True
        yield False

当您对其进行迭代时,该生成器将在True和值之间切换。False那里的序列中没有位置,因此也没有暴露位置的意义。

坚持下去enumerate()。所enumerate()要做的就是保持一个柜台。它根本不在包装的迭代器中保持位置。增加该整数不会花费您太多的性能或内存。

enumerate()基本上就是这样,在 C 中实现

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1

因为它是在 C 中实现的,所以它会在任何一天尝试读取原始迭代器上的属性,这将需要在每次迭代中进行更多的字节码操作。

于 2013-03-22T14:03:55.750 回答
1

该“指针”值对于创建迭代器的任何内容都是内部的。请记住,它不需要是一个列表(可以被索引的东西),所以如果你真的想要“索引”,你将需要使用枚举。

于 2013-03-22T14:02:25.710 回答
1

此信息在迭代器内部,无法访问。有关迭代器协议的描述,请参见此处。本质上,迭代器的唯一公开可用的成员是一旦范围用完就会next()引发异常。StopIteration

此外,enumerate效率很高。相当于写

i = -1
for x in y:
  i += 1
  # do something with x and i
于 2013-03-22T14:03:38.310 回答
1

不,它使用底层迭代器,它不会强制跟踪当前索引。

除非您手动增加一个计数器,否则这是不可能的:

idx = 0
for x in y:
    idx+=1
    # ...

所以,请继续enumerate()

于 2013-03-22T14:01:24.477 回答