在“for x in y:”循环中,我们当前处于哪个元素

2024-04-25 22:38:58 发布

您现在位置:Python中文网/ 问答频道 /正文

迭代列表的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

Tags: in元素列表forindexiffoo语法
3条回答

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

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

>>> 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

当您迭代时,该生成器将在TrueFalse值之间切换。序列中没有位置,所以也没有暴露位置的点。你知道吗

只要坚持enumerate()enumerate()要做的就是保留一个计数器。它在包装的迭代器中根本不保持位置。递增该整数不会消耗太多性能或内存。你知道吗

^{}基本上是这个,implemented in C

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

因为它是用C语言实现的,所以在任何一天都不会试图读取原始迭代器上的属性,因为每次迭代都需要更多的字节码操作。你知道吗

此信息是迭代器的内部信息,无法访问。有关iterator protocol的描述,请参见此处。实际上,迭代器的唯一公开成员是next(),一旦范围用完,它就会引发StopIteration异常。你知道吗

此外,enumerate非常有效。它相当于写作

i = -1
for x in y:
  i += 1
  # do something with x and i

“指针”值是创建迭代器的任何值的内部值。记住,is不需要是一个列表(可以被索引的东西),所以如果你真的想要“索引”,你需要使用enumerate。你知道吗

相关问题 更多 >