Mar*_*ers 496
该enumerate()函数为可迭代添加计数器.
因此,对于每个元素cursor,生成一个元组(counter, element); 的for循环,以结合row_number和row,分别.
演示:
>>> 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.
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)
| 归档时间: |
|
| 查看次数: |
374220 次 |
| 最近记录: |