Answers:
尚未对此进行广泛的测试,但是可以在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)
>>>
如果您习惯于使用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()
返回迭代器。
items()
创建列表并因此使用内存,而iteritems()
实际上不使用内存。使用什么主要取决于字典的大小。此外,从Python 2到Python 3的自动转换工具(2to3
)会自动处理从iteritems()
到的转换items()
,因此无需担心。
collections.OrderedDict
然后进行一次排序并始终按排序顺序获得项目。
iteritems()
不使用内存,也必须将所有内容都放入for的内存中sorted()
,因此使用items()
和iteritems()
这里在内存方面没有区别。
items()
(在,返回的列表中items()
,在排序列表中),使用一次存储iteritems()
(仅在排序列表中)。
使用 sorted()
功能:
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(foo.keys())
最好使用等效项sorted(foo)
,因为字典在迭代时会返回其键(可能具有不被迫创建foo.keys()
中间列表的优势,这取决于sorted()
可迭代对象的实现方式)。
k in sorted(foo.keys()):
它可以拉动键或for k,v in sorted(foo.items()):
返回字典列表对的副本sorted(foo.keys())
您现在也可以OrderedDict
在Python 2.7中使用:
>>> 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)
>>> 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的collections.OrderedDict。(仅适用于Python 3)
假设您正在使用CPython 2.x并拥有一个较大的字典mydict,那么使用sorted(mydict)将会很慢,因为sorted会建立mydict键的排序列表。
在那种情况下,您可能要看一下我的orderdict包,其中包括sorteddict
in C 的C实现。尤其是如果您必须在字典生命周期的不同阶段(即元素数)多次遍历键的排序列表时,请注意。
.items()
而不是iteritems()
:iteritems不适用于Python 3.x,但items()
可从Python 2.6获得。