当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Python中,如何按排序键顺序迭代字典?》经验,为你挑选了7个好方法。

现有的函数以下结尾,其中d是字典:

return d.iteritems()

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



1> 小智..:

没有对此进行过广泛的测试,但是在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()`的转换,因此无需担心这一点.
使用`.items()`而不是`iteritems()`:正如@Claudiu所说,iteritems不适用于Python 3.x,但是`items()`可以从Python 2.6获得.
但@EOL,即使`iteritems()`不使用内存,所有内容都必须被拉入内存中`sorted()`,所以在这里使用`items()`和`iteritems()`没有区别内存明智的.
@Richard:虽然所有元素都必须被拉入内存,但是它们用`items()`(在`items()`返回的列表中,并在排序列表中)存储*两次,并且只存在一次使用`iteritems()`(仅在排序列表中).
@HowerHell使用`collections.OrderedDict`然后你排序一次并按排序顺序获取项目.

2> Greg Hewgill..:

使用sorted()功能:

return sorted(dict.iteritems())

如果你想要一个实际的迭代器而不是排序的结果,因为sorted()返回一个列表,使用:

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



3> Peter Rowell..:

字典的密钥存储在哈希表中,因此它们是"自然顺序",即伪随机.任何其他排序都是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]


`sorted(foo.keys())`作为等效的`sorted(foo)`更好,因为字典在迭代时返回它们的键(具有不被强制创建`foo.keys()`中间列表的优点,也许 - 取决于如何为iterables实现`sorted()`.

4> Claudiu..:

格雷格的回答是对的.请注意,在Python 3.0中,您将不得不这样做

sorted(dict.items())

iteritems将不复存在.


"不要使用汽车,因为将来我们会有悬浮板"

5> Caumons..:

您现在也可以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 的新页面.



6> pythonlarry..:

一般来说,人们可能会像这样排序一个字典:

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)



7> jamylak..:
>>> 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)排序,但是,经过短暂的线性堆排序后,它会按排序顺序生成项目,从理论上讲,当您不总是需要整个列表时,它的效率更高。

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有