[英]In Python, how do I iterate over a dictionary in sorted key order?
现有的函数以下结尾,其中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(): ...
执行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
将会消失。
您现在也可以在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版本和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)排序,但是,在短线性堆化之后,它会按照排序顺序生成项目,从而在理论上当您不总是需要整个列表时更有效。
sorted返回一个列表,因此当你尝试迭代它时你的错误,但因为你不能订购一个字典,你将不得不处理一个列表。
我不知道你的代码的更大的上下文是什么,但你可以尝试在结果列表中添加一个迭代器。 这样吗?:
return iter(sorted(dict.iteritems()))
当然,你现在会回到元组因为排序把你的字母变成了一个元组列表
例如:说你的字典是: {'a':1,'c':3,'b':2}
排序将其转换为列表:
[('a',1),('b',2),('c',3)]
所以当你实际迭代列表时,你会得到一个由字符串和整数组成的元组(在这个例子中),但至少你可以迭代它。
如果要按插入项而不是键的顺序排序,则应该查看Python的collections.OrderedDict 。 (仅限Python 3)
假设你正在使用CPython 2.x并且有一个大字典mydict,那么使用sorted(mydict)将会很慢,因为sorted会构建一个mydict键的排序列表。
在这种情况下,您可能希望查看我的ordereddict包,其中包含C语言中的sorteddict
的C实现。特别是如果您必须在字典生命周期的不同阶段(即元素数量)多次查看键的排序列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.