$ python
Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import collections
>>> a = collections.OrderedDict({'a':'1','b':'2'})
>>> a
OrderedDict([('a', '1'), ('b', '2')])
>>> for i, (k,v) in enumerate(a.iteritems()):
... print i, k, v
...
0 a 1
1 b 2
很丑,如果你问我。
我不知道为什么你对索引感兴趣。
字典的想法是让我们忽略索引。
字典和队列背后有很多逻辑,使我们不必关注索引。
如果你坚持要获取索引,就没有必要迭代两次了。
让我们看看enumerate对列表做了什么:
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
注意“start”。
enumerate 知道如何管理列表。字典将数据存储为列表,某个地方在其内部。那么,如果我们在字典上使用 enumerate 会发生什么?
>>> for i,k in enumerate(a):
... print i,k
...
0 a
1 b
在这种情况下,我会选择优雅的方式:
>>> for i,k in enumerate(a):
... print i,k,a[k]
...
0 a 1
1 b 2
我认为“for i, (k,v) in”的写法暴露了太多的内部结构。使用“for i,k in”可以保护我们,在重构时,我们不需要改变循环的方式,只需要改变循环中所做的事情。少了一个需要关注的方面。
更不用说这个枚举函数在 Python 2.6 之后的任何版本中都能正常工作 :)
https://docs.python.org/2/library/stdtypes.html#dict.iteritems
https://docs.python.org/2/library/functions.html#enumerate
dict.items()
呢?它会构造一个新的列表。 - omerfarukdogandict.items()
返回一个视图而非列表。而且在Python 3.x中没有dict.iteritems
。请参考字典视图。 - falsetru