enumerate()是什么意思?

时间:2014-03-04 12:08:58

标签: python enumerate

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

enumerate在这种情况下的含义是什么?

6 个答案:

答案 0 :(得分:469)

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

答案 1 :(得分:85)

这是内置生成器函数,请参阅http://docs.python.org/2/library/functions.html#enumerate

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

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

打印

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

如果你想循环遍历一个interator,并且想要一个索引计数器,那么它会很有用。如果您希望计数器从其他值(通常为1)开始,您可以将其作为enumerate的第二个参数。

答案 2 :(得分:19)

我正在阅读Brett Slatkin的一本书(' Effective Python' ),他展示了另一种迭代列表的方法,并且还知道了当前项目的索引。名单。 但建议不要使用它并使用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我必须写:

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

答案 3 :(得分:13)

正如其他用户所提到的,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])。

尽管另一个用户提到了使用enumerate的{​​{1}}的实现,但我认为以下是一种不使用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) 函数的任意可迭代对象。

答案 4 :(得分:10)

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

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

答案 5 :(得分:0)

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

for el in my_list:
    # do something

现在有时不仅需要迭代元素,而且每次迭代都需要索引。一种方法是:

i = 0
for el in my_list:
    # do somethings, and use value of "i" somehow
    i += 1

但是,更好的方法是使用函数“枚举”。枚举的作用是接收一个列表,并返回一个类似列表的对象(可以迭代的可迭代对象),但是此新列表的每个元素本身都包含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)是可迭代的。