enumerate()是什么意思?

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

在这个上下文中enumerate是什么意思?

403028 次浏览

enumerate()函数函数将一个计数器添加到可迭代对象中。

因此对于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()进行计数,另一个在生成器函数中手动计数:

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

C语言的实际实现更接近后者,它进行了优化,为常见的for i, ...开箱重用单个元组对象,并为计数器使用标准C整数值,直到计数器变得太大,以避免使用Python整型对象(它是无界的)。

它是一个内建函数,返回一个可以迭代的对象。看到的文档

简而言之,它循环遍历可迭代对象(如列表)的元素,以及组合在元组中的索引号:

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

打印

(0, "a")
(1, "b")
(2, "c")

如果你想要循环一个序列(或其他可迭代的东西),并且还想要有一个可用的索引计数器,这是很有帮助的。如果你想让计数器从其他值开始(通常是1),你可以把它作为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)

输出为

(0, 'I like movie')
(1, " But I don't like the cast")
(2, ' The story is very nice')

我正在读Brett Slatkin的一本书(有效的Python),他展示了另一种迭代列表的方法,也知道列表中当前项目的索引,他建议最好不要使用它,而是使用enumerate。 我知道你问什么是枚举的意思,但当我理解以下内容时,我也理解了enumerate如何在知道当前项的索引的同时更容易(且更可读)遍历列表。< / p >

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 += 1

它产生相同的输出。

但是对于enumerate,我只需要写:

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

正如其他用户所提到的,enumerate是一个生成器,它在可迭代对象的每一项旁边添加增量索引。

所以如果你有一个列表,比如l = ["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`

所以你的代码读起来更好,因为你也可以用range做一个常规的for循环,但然后访问你需要索引它们的项(即joint_values[i])。

虽然另一个用户提到了使用zip实现enumerate,但我认为不使用itertools的更纯粹(但略复杂)的方式如下:

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

例子:

l = ["test_1", "test_2", "test_3"]
enumerate(l)
enumerate(l, 10)

输出:

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

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

正如注释中提到的,这种带range的方法不能像原来的enumerate函数那样对任意可迭代对象起作用。

我假设你知道如何迭代某些列表中的元素:

for el in my_list:
# do something

现在,有时不仅需要遍历元素,还需要每次迭代的索引。一种方法是:

i = 0
for el in my_list:
# do somethings, and use value of "i" somehow
i += 1
然而,更好的方法是使用“enumerate_”函数。enumerate所做的是它接收一个列表,并返回一个类似列表的对象(一个可以迭代的可迭代对象),但这个新列表的每个元素本身包含两个元素:索引和原始输入列表的值: 如果你有

arr = ['a', 'b', 'c']

则输入命令 enumerate(arr) 返回如下内容:

[(0,'a'), (1,'b'), (2,'c')]

现在,如果你遍历一个列表(或可迭代对象),其中每个元素本身都有2个子元素,你可以在for循环中捕获这两个子元素,如下所示:

for index, value in enumerate(arr):
print(index,value)

它将打印出enumerate输出的子元素。

一般来说,你基本上可以“解包”;从列表中的多个项目变成多个变量,如下所示:

idx,value = (2,'c')
print(idx)
print(value)

它会打印

2
c

这是在以enumerate(arr)为可迭代对象的循环的每次迭代中发生的赋值。

enumerate函数同时计算元素索引和元素值。我相信下面的代码将有助于解释发生了什么。

for i,item in enumerate(initial_config):
print(f'index{i} value{item}')