现有的函数以下结尾,其中d
是字典:
return d.iteritems()
返回给定字典的未排序迭代器.我想返回一个遍历按键排序的项目的迭代器.我怎么做?
没有对此进行过广泛的测试,但是在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()
返回迭代器.
使用sorted()
功能:
return sorted(dict.iteritems())
如果你想要一个实际的迭代器而不是排序的结果,因为sorted()
返回一个列表,使用:
return iter(sorted(dict.iteritems()))
字典的密钥存储在哈希表中,因此它们是"自然顺序",即伪随机.任何其他排序都是dict消费者的概念.
sorted()总是返回一个列表,而不是一个dict.如果你传递一个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]
格雷格的回答是对的.请注意,在Python 3.0中,您将不得不这样做
sorted(dict.items())
如iteritems
将不复存在.
您现在也可以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)排序,但是,经过短暂的线性堆排序后,它会按排序顺序生成项目,从理论上讲,当您不总是需要整个列表时,它的效率更高。