有一个现有的函数,其结尾如下,其中
d
是一个字典:
return d.iteritems()
返回给定字典的未排序迭代器。我想返回一个遍历按键排序的项目的迭代器。我该怎么做?
>>> d = {"x":2, "h":15, "a":2222}
>>> it = iter(sorted(d.iteritems()))
>>> it.next()
('a', 2222)
>>> it.next()
('h', 15)
>>> it.next()
('x', 2)
>>>
如果您习惯使用
for key, value in d.iteritems(): ...
而不是迭代器,这仍然适用于上面的解决方案
>>> 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()
来返回迭代器。功能:
return sorted(dict.iteritems())
如果您想要对排序结果进行实际迭代,因为
sorted()
返回一个列表,请使用:
return iter(sorted(dict.iteritems()))
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)]
下面的内容感觉像是循环中的字典,但事实并非如此,它是一个被解包到 k,v 中的元组列表:
for k,v in sorted(foo.items()):
print k, v
大致相当于:
for k in sorted(foo.keys()):
print k, foo[k]
sorted(dict.items())
因为
iteritems
将会消失。
OrderedDict
:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
这里有 2.7 版本的新增功能
页面和 OrderedDict API。
for k in sorted(d):
print k, d[k]
对于问题中的具体情况,对 d.iteritems() 进行“替换”,添加如下函数:
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()
到
return sortdict(dict)
或
return sortdict(dict, reverse = True)
此方法仍然具有 O(N log N) 排序,但是,在短暂的线性堆化之后,它会按排序顺序生成项目,理论上,当您并不总是需要整个列表时,它会更有效。
我不知道你的代码的更大上下文是什么,但你可以尝试添加一个 结果列表的迭代器。 也许像这样?:
return iter(sorted(dict.iteritems()))
当然你现在会得到元组,因为排序将你的字典变成了元组列表
例如: 说你的字典是:
{'a':1,'c':3,'b':2}
排序将其变成列表:
[('a',1),('b',2),('c',3)]
因此,当您实际迭代列表时,您会返回(在本示例中)一个元组 由一个字符串和一个整数组成,但至少你能够迭代它。