什么是迭代OrderedDict

时间:2015-06-25 09:22:46

标签: python python-2.7 loops dictionary

我有一个OrderedDict,在循环中我想得到索引,键和值。 这肯定可以通过多种方式完成,即

a = collections.OrderedDict({…})
for i,b,c in zip(range(len(a)), a.iterkeys(), a.itervalues()):
  …

但我想避免范围(len(a))并将a.iterkeys(),a.itervalues()缩短为a.iteritems()之类的东西。 使用枚举和iteritems,可以将其改写为

for i,d in enumerate(a.iteritems()):
  b,c = d

但它需要在循环体内解包。 有没有办法解析for语句或者更优雅的迭代方式?

3 个答案:

答案 0 :(得分:53)

您可以在for statement中使用元组解包:

for i, (key, value) in enumerate(a.iteritems()):
    # Do something with i, key, value
>>> d = {'a': 'b'}
>>> for i, (key, value) in enumerate(d.iteritems()):
...     print i, key, value
... 
0 a b

旁注:

在Python 3.x中,使用dict.items()返回可迭代的字典视图。

>>> for i, (key, value) in enumerate(d.items()):
...     print(i, key, value)

答案 1 :(得分:2)

$ 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

如果你问我,那很难看。

我不知道你为什么对索引感兴趣。 dict之间的想法是你要对索引一无所知。 dict和队列背后有很多逻辑,所以我们要没有索引。

如果您坚持获取索引,则无需重复两次。

让我们看一下枚举对列表的作用:

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

请注意“开始”。

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

我觉得“对于我,(k,v)in”过早暴露了太多的内部结构。 使用“for i,k in”,我们受到保护,当重构时,我们不需要触摸循环的方式。我们只需要改变我们在循环中所做的事情。少照顾一个方面。

更不用说这个枚举的调用在2.6:)之后的任何python中都是一样的。)

https://docs.python.org/2/library/stdtypes.html#dict.iteritems

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

答案 2 :(得分:0)

使用方法valuesitems获取view,然后将其排版为iterator

e.g。按字典中的值排序

sorted(iter(my_dict.values()))