枚举是什么意思?

use*_*098 311 python enumerate

我在Python中使用tkinter并遇到以下代码:

__PRE__

我想知道是否有人能解释在这种情况下枚举的含义是什么?

Mar*_*ers 496

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
Run Code Online (Sandbox Code Playgroud)

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

>>> for count, elem in enumerate(elements, 42):
...     print count, elem
... 
42 foo
43 bar
44 baz
Run Code Online (Sandbox Code Playgroud)

如果你要enumerate()在Python中重新实现,这里有两种实现方法; 一个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)
Run Code Online (Sandbox Code Playgroud)

def enumerate(it, start=0):
    count = start
    for elem in it:
        yield (count, elem)
        count += 1
Run Code Online (Sandbox Code Playgroud)

C中实际实现更接近于后者,优化了将单个元组对象重用于公共for i, ...解包情况并对计数器使用标准C整数值,直到计数器变得太大而无法避免使用Python整数对象(这是无界).


Rem*_*ich 90

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

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

for item in enumerate(["a", "b", "c"]):
    print item
Run Code Online (Sandbox Code Playgroud)

版画

(0, "a")
(1, "b")
(2, "c")
Run Code Online (Sandbox Code Playgroud)

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

  • Pedantic:它是一个返回迭代器的函数,而不是一个生成器。[生成器是一类特定的用户定义函数](/sf/ask/3707906961/)(使用`yield`/`yield from`,或生成器表达式,隐含`yield`);`enumerate` 不是生成器。对于所有与鸭子类型相关的目的,没有区别,但显式类型检查和 Python 语言文档仅将术语“生成器”用于一个目的,不包括“枚举”。 (2认同)

Dor*_*ora 20

我正在阅读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)
Run Code Online (Sandbox Code Playgroud)

输出是:

0 a
1 b
2 c
Run Code Online (Sandbox Code Playgroud)

在我阅读这个enumerate函数之前,我也经常做一些事情,甚至更愚蠢.

i = 0
for n in list_of_letters:
    print (i, n)
    i = i +1
Run Code Online (Sandbox Code Playgroud)

它产生相同的输出.

enumerate我必须写:

list_of_letters = ['a', 'b', 'c']
for i, letter in enumerate(list_of_letters):
    print (i, letter)
Run Code Online (Sandbox Code Playgroud)


Raf*_*ael 19

正如其他用户所提到的,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`
Run Code Online (Sandbox Code Playgroud)

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

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

def enumerate(l, start=0):
    return zip(range(start, len(l) + start), l)
Run Code Online (Sandbox Code Playgroud)

例:

l = ["test_1", "test_2", "test_3"]
enumerate(l)
enumerate(l, 10)
Run Code Online (Sandbox Code Playgroud)

输出:

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

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


Ash*_*man 12

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

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)
Run Code Online (Sandbox Code Playgroud)

输出是

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