有一个现有的函数以下面的形式结束,其中d是一个字典:

return d.iteritems()

它返回给定字典的未排序迭代器。我想返回一个迭代器,遍历按键排序的项。我怎么做呢?


当前回答

使用sorted()函数:

return sorted(dict.iteritems())

如果你想在排序结果上使用一个实际的迭代器,因为sorted()返回一个列表,请使用:

return iter(sorted(dict.iteritems()))

其他回答

如果你想按插入项的顺序排序,而不是按键的顺序排序,你应该看看Python的collections.OrderedDict。(仅限Python 3)

使用sorted()函数:

return sorted(dict.iteritems())

如果你想在排序结果上使用一个实际的迭代器,因为sorted()返回一个列表,请使用:

return iter(sorted(dict.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会消失。

假设你使用的是CPython 2。X,并且有一个大的字典mydict,那么使用sorted(mydict)将会很慢,因为sorted构建了一个mydict的键的排序列表。

在这种情况下,你可能想看看我的ordereddict包,其中包括一个C语言的sorteddict的C实现,特别是如果你必须在不同的阶段多次检查排序的键列表(例如。元素数量)的字典生命周期。

http://anthon.home.xs4all.nl/Python/ordereddict/