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

return d.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。

其他回答

字典的键存储在哈希表中,因此这是它们的“自然顺序”,即伪随机。任何其他排序都是字典消费者的概念。

Sorted()总是返回一个列表,而不是字典。如果你给它传递一个dict.items()(它会产生一个元组列表),它将返回一个元组列表[(k1,v1), (k2,v2),…它可以在循环中使用,在某种程度上非常像字典,但它无论如何都不是字典!

foo = {
    'a':    1,
    'b':    2,
    'c':    3,
    }

print foo
>>> {'a': 1, 'c': 3, 'b': 2}

print foo.items()
>>> [('a', 1), ('c', 3), ('b', 2)]

print sorted(foo.items())
>>> [('a', 1), ('b', 2), ('c', 3)]

下面的感觉像是循环中的dict,但它不是,它是一个元组列表,被解压缩为k,v:

for k,v in sorted(foo.items()):
    print k, v

大致相当于:

for k in sorted(foo.keys()):
    print k, foo[k]

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

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

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

一般来说,字典可以这样排序:

for k in sorted(d):
    print k, d[k]

对于问题中的特定情况,对d.t iteritems()进行“drop in replacement”,添加如下函数:

def sortdict(d, **opts):
    # **opts so any currently supported sorted() options can be passed
    for k in sorted(d, **opts):
        yield k, d[k]

所以终点线从

return dict.iteritems()

to

return sortdict(dict)

or

return sortdict(dict, reverse = True)

格雷格的答案是正确的。注意,在Python 3.0中,你必须这样做

sorted(dict.items())

因为iteritems会消失。

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