有一个现有的函数以下面的形式结束,其中d是一个字典:
return d.iteritems()
它返回给定字典的未排序迭代器。我想返回一个迭代器,遍历按键排序的项。我怎么做呢?
有一个现有的函数以下面的形式结束,其中d是一个字典:
return d.iteritems()
它返回给定字典的未排序迭代器。我想返回一个迭代器,遍历按键排序的项。我怎么做呢?
当前回答
>>> import heapq
>>> d = {"c": 2, "b": 9, "a": 4, "d": 8}
>>> def iter_sorted(d):
keys = list(d)
heapq.heapify(keys) # Transforms to heap in O(N) time
while keys:
k = heapq.heappop(keys) # takes O(log n) time
yield (k, d[k])
>>> i = iter_sorted(d)
>>> for x in i:
print x
('a', 4)
('b', 9)
('c', 2)
('d', 8)
这个方法仍然有一个O(N log N)排序,然而,在一个简短的线性堆化之后,它会生成有序的条目,当你不总是需要整个列表时,理论上它更有效。
其他回答
格雷格的答案是正确的。注意,在Python 3.0中,你必须这样做
sorted(dict.items())
因为iteritems会消失。
你现在也可以在Python 2.7中使用OrderedDict:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
这里有2.7版本的what's new页面和OrderedDict API。
还没有对它进行广泛测试,但在Python 2.5.2中可以工作。
>>> d = {"x":2, "h":15, "a":2222}
>>> it = iter(sorted(d.iteritems()))
>>> it.next()
('a', 2222)
>>> it.next()
('h', 15)
>>> it.next()
('x', 2)
>>>
如果你习惯在d.t iteritems()中执行for key, value:…而不是迭代器,这仍然适用于上面的解决方案
>>> d = {"x":2, "h":15, "a":2222}
>>> for key, value in sorted(d.iteritems()):
>>> print(key, value)
('a', 2222)
('h', 15)
('x', 2)
>>>
使用Python 3。X,使用d.items()而不是d.iteritems()返回迭代器。
使用sorted()函数:
return sorted(dict.iteritems())
如果你想在排序结果上使用一个实际的迭代器,因为sorted()返回一个列表,请使用:
return iter(sorted(dict.iteritems()))
如果你想按插入项的顺序排序,而不是按键的顺序排序,你应该看看Python的collections.OrderedDict。(仅限Python 3)