有一个现有的函数以下面的形式结束,其中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。

其他回答

还没有对它进行广泛测试,但在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()返回迭代器。

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

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的collections.OrderedDict。(仅限Python 3)

格雷格的答案是正确的。注意,在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。