Python中enumerate对象的用法与特点

2017-03-09 董付国 Python小屋 Python小屋

Python的内置函数enumerate()函数用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组。

#枚举字符串中的元素

>>> list(enumerate('abcd'))

[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

#枚举列表中的元素

>>> list(enumerate(['Python', 'Greate']))

[(0, 'Python'), (1, 'Greate')]

>>> d = {'a':97, 'b':98, 'c':99}

#枚举字典中的元素

>>> list(enumerate(d.items()))

[(0, ('a', 97)), (1, ('b', 98)), (2, ('c', 99))]

#枚举range对象中的元素

>>> for index, value in enumerate(range(10, 15)):

print((index, value), end=' ')

(0, 10) (1, 11) (2, 12) (3, 13) (4, 14) 

#可以指定枚举时索引的起始值,这并不常用

>>> list(enumerate('abcd', 5))

[(5, 'a'), (6, 'b'), (7, 'c'), (8, 'd')]


enumerate对象具有惰性求值特点,就好像一个一端有挡板的管子里有很多外径略小于管子内径的圆球,每次只能打开挡板拿出最前面的圆球,不去拿的时候挡板是关的,不会有圆球出来。并且,已经拿出来的圆球管子里就没有了(可以想象每个圆球都有编号)。

正如上面所说,enumerate对象中已经访问过的元素无法再次访问,在使用时要注意这个问题。另外,zip、filter、map等对象也具有类似的特点。

>>> x = enumerate('abcde')

>>> (0,'a') in x

True

#元素(0,'a')已经访问过了,无法再次访问

>>> (0,'a') in x

False

#不支持使用下标访问其中的元素

>>> x[-1]

Traceback (most recent call last):

  File "<pyshell#43>", line 1, in <module>

    x[-1]

TypeError: 'enumerate' object is not subscriptable