enumerate()是什么意思?

问题描述 投票:285回答:5

for row_number, row in enumerate(cursor):在Python中做了什么?

在这种情况下,enumerate意味着什么?

python enumerate
5个回答
480
投票

enumerate() function为迭代添加了一个计数器。

因此,对于cursor中的每个元素,使用(counter, element)生成元组; for循环分别将它绑定到row_numberrow

演示:

>>> elements = ('foo', 'bar', 'baz')
>>> for elem in elements:
...     print elem
... 
foo
bar
baz
>>> for count, elem in enumerate(elements):
...     print count, elem
... 
0 foo
1 bar
2 baz

默认情况下,enumerate()开始在0计数,但如果你给它一个第二个整数参数,它将从该数字开始:

>>> for count, elem in enumerate(elements, 42):
...     print count, elem
... 
42 foo
43 bar
44 baz

如果你在Python中重新实现enumerate(),有两种方法可以实现这一点;一个使用itertools.count()进行计数,另一个使用generator function手动计数:

from itertools import count

def enumerate(it, start=0):
    # return an iterator that adds a counter to each element of it
    return zip(count(start), it)

def enumerate(it, start=0):
    count = start
    for elem in it:
        yield (count, elem)
        count += 1

actual implementation in C更接近后者,优化重用单个元组对象用于常见的for i, ...解包情况并使用标准C整数值作为计数器,直到计数器变得太大而无法避免使用Python整数对象(无限制) 。


85
投票

它是内置的生成器功能,请参阅qazxsw poi。

简而言之,它产生迭代器的元素,以及索引号:

http://docs.python.org/2/library/functions.html#enumerate

版画

for item in enumerate(["a", "b", "c"]):
    print item

如果你想循环遍历一个interator,并且想要一个索引计数器,它会很有用。如果你想让计数器从其他值开始(通常是1),你可以将它作为(0, "a") (1, "b") (2, "c") 的第二个参数。


19
投票

我正在阅读Brett Slatkin的一本书('Effective Python'),他展示了另一种迭代列表的方法,并且还知道列表中当前项目的索引。但建议不要使用它,而是使用enumerate。我知道你问的枚举意味着什么,但是当我理解了以下内容时,我也理解了enumerate如何在知道当前项的索引更容易(并且更具可读性)的同时迭代列表。

enumerate

输出是:

list_of_letters = ['a', 'b', 'c']
for i in range(len(list_of_letters)):
    letter = list_of_letters[i]
    print (i, letter)

在我读到关于0 a 1 b 2 c 函数之前,我还习惯做一些事情,甚至更愚蠢。

enumerate

它产生相同的输出。

但是使用i = 0 for n in list_of_letters: print (i, n) i = i +1 我只需要写:

enumerate

14
投票

正如其他用户所提到的,list_of_letters = ['a', 'b', 'c'] for i, letter in enumerate(list_of_letters): print (i, letter) 是一个生成器,它在迭代的每个项旁边添加一个增量索引。

所以,如果你有一个名单enumeratel = ["test_1", "test_2", "test_3"]会给你这样的东西:list(enumerate(l))

现在,这有用吗?一个可能的用例是当你想迭代项目时,你想要跳过一个你只知道列表中的索引而不是它的值的特定项目(因为它的值当时是未知的)。

[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]

所以你的代码读得更好,因为你也可以用for index, value in enumerate(joint_values): if index == 3: continue # Do something with the other `value` 做一个常规for循环,但然后访问你需要索引它们的项目(即range)。

虽然另一个用户提到使用joint_values[i]实现enumerate,但我认为如果不使用zip,更纯粹(但稍微复杂一点)的方法如下:

itertools

例:

def enumerate(l, start=0):
    return zip(range(start, len(l) + start), l)

输出:

[(0,'test_1'),(1,'test_2'),(2,'test_3')]

[(10,'test_1'),(11,'test_2'),(12,'test_3')]

正如评论中所提到的,这种带范围的方法不适用于任意迭代,就像原始的l = ["test_1", "test_2", "test_3"] enumerate(l) enumerate(l, 10) 函数那样。


10
投票

枚举函数的工作原理如下:

enumerate

输出是

doc = """I like movie. But I don't like the cast. The story is very nice"""
doc1 = doc.split('.')
for i in enumerate(doc1):
     print(i)
© www.soinside.com 2019 - 2024. All rights reserved.