enumerate在python中是什么意思_关于python:enumerate()是什么意思?

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

enumerate在这种情况下意味着什么?

docs.python.org/2/library/functions.html#enumerate

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

默认情况下,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, ...解包情况并对计数器使用标准C整数值,直到计数器变得太大而无法避免使用Python整数对象(这是无限的)。

它是内置生成器函数,请参阅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的第二个参数。

如果向item添加第二个变量,则可以删除括号:D

迂腐:这是一个返回迭代器而不是生成器的函数。 生成器是一组特定的用户定义函数(使用yield / yield from或生成器表达式,隐式yield); enumerate不是发电机。 对于所有与鸭子类型相关的目的,没有区别,但显式类型检查和Python语言文档仅将"生成器"一词用于一个目的,但不包括enumerate。

我正在阅读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)

正如其他用户所提到的,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函数的任意迭代。

其他答案提及itertools的原因是您的range方法仅适用于容器。 enumerate适用于任意迭代; 如果你想迭代一个文件,for lineno, line in enumerate(myfile):可以工作,但你不能做range(len(myfile)),因为直到你达到EOF才知道长度。

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值