繁体   English   中英

枚举()是什么意思?

[英]What does enumerate() mean?

for row_number, row in enumerate(cursor): do in Python 的作用是什么?

在这种情况下enumerate是什么意思?

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, ... Python 整数对象(无界)。

它是一个内置函数,它返回一个可以迭代的对象。 请参阅文档

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

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

印刷

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

如果您想遍历一个序列(或其他可迭代的东西),并且还希望有一个可用的索引计数器,这会很有帮助。 如果您希望计数器从某个其他值(通常为 1)开始,您可以将其作为enumerate第二个参数。

我正在阅读 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 += 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')]

正如评论中提到的,这种带范围的方法不能像原始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')

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

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 的作用是接收一个列表,并返回一个类似列表的对象(一个可以迭代的可迭代对象),但这个新列表本身的每个元素都包含 2 个元素:索引和来自原始输入列表的值:所以如果你有

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

然后命令enumerate(arr)返回如下内容:

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

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

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

这将打印出枚举输出的子元素。

一般来说,您基本上可以将列表中的多个项目“解压缩”为多个变量,如下所示:

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

哪个会打印

2
c

这是在enumerate(arr)为可迭代的循环的每次迭代中发生的分配类型。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM