什么是row_number,行在枚举(游标):做Python?
在这个上下文中,enumerate是什么意思?
什么是row_number,行在枚举(游标):做Python?
在这个上下文中,enumerate是什么意思?
当前回答
正如其他用户所提到的,enumerate是一个生成器,它在可迭代对象的每一项旁边添加增量索引。
因此,如果你有一个列表,比如l = ["test_1", "test_2", "test_3"],列表(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实现枚举,但我认为不使用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函数那样适用于任意可迭代对象。
其他回答
函数的作用是:向可迭代对象中添加一个计数器。
因此,对于游标中的每个元素,使用(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
默认情况下,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)
and
def enumerate(it, start=0):
count = start
for elem in it:
yield (count, elem)
count += 1
C语言的实际实现更接近后者,通过优化重用单个tuple对象的common for i,…为避免使用Python整数对象(它是无界的),将计数器使用标准C整数值,直到计数器变得太大。
它是一个内建函数,返回一个可以迭代的对象。请参见文档。
简而言之,它循环遍历可迭代对象(如列表)的元素,以及组合在元组中的索引号:
for item in enumerate(["a", "b", "c"]):
print item
打印
(0, "a")
(1, "b")
(2, "c")
如果你想要循环一个序列(或其他可迭代的东西),并且还想要有一个可用的索引计数器,这是很有帮助的。如果你想让计数器从其他值开始(通常是1),你可以把它作为第二个参数来枚举。
枚举函数的工作原理如下:
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写的一本书(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
在我读到枚举函数之前,我还曾经做过一些更愚蠢的事情。
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"],列表(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实现枚举,但我认为不使用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函数那样适用于任意可迭代对象。