在Python中,如何按排序的键顺序迭代字典?

问题描述 投票:0回答:10

有一个现有的函数,其结尾如下,其中

d
是一个字典:

return d.iteritems()

返回给定字典的未排序迭代器。我想返回一个遍历按键排序的项目的迭代器。我该怎么做?

python sorting dictionary
10个回答
184
投票

>>> 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()
来返回迭代器。
    


86
投票

sorted()

功能:
return sorted(dict.iteritems())

如果您想要对排序结果进行实际迭代,因为 
sorted()

返回一个列表,请使用:

return iter(sorted(dict.iteritems()))



43
投票

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]



35
投票

sorted(dict.items())

因为
iteritems

将会消失。

    


7
投票
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


6
投票

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)



5
投票
此方法仍然具有 O(N log N) 排序,但是,在短暂的线性堆化之后,它会按排序顺序生成项目,理论上,当您并不总是需要整个列表时,它会更有效。 


4
投票
collections.OrderedDict

。 (仅限 Python 3)


3
投票

我不知道你的代码的更大上下文是什么,但你可以尝试添加一个 结果列表的迭代器。 也许像这样?:

return iter(sorted(dict.iteritems()))

当然你现在会得到元组,因为排序将你的字典变成了元组列表

例如: 说你的字典是:

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

排序将其变成列表:


[('a',1),('b',2),('c',3)]

因此,当您实际迭代列表时,您会返回(在本示例中)一个元组
由一个字符串和一个整数组成,但至少你能够迭代它。


2
投票

在这种情况下,您可能想查看我的ordereddict包,其中包含C中

sorteddict

的C实现。特别是如果您必须在不同阶段(即元素数量)多次检查键的排序列表字典的生命周期。


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

© www.soinside.com 2019 - 2024. All rights reserved.