如何遍历按值排序的字典的键?

时间:2014-03-05 10:05:34

标签: python python-2.7

我想迭代使用值排序的字典的键。一种方法是使用有序字典意味着用排序值初始化字典。

代码:

from collections import OrderedDict

data = OrderedDict([('a',0), ('d',1), ('c',2), ('b',3)])

for mykey in data:
    print mykey

如何在不使用Ordered字典的情况下实现这一目标? 我知道以上是实现这一点的正确方法,我只是想知道我们可以不使用Ordered字典做同样的事情。

sorted(dictionary.values) 

只会给我排序的值列表,而不是整个字典的排序值,所以我不能在这里输入密钥。

2 个答案:

答案 0 :(得分:1)

使用dict.iteritems从dict获取元组列表,并使用sorted对其进行排序:

sorted(dictionary.iteritems(), key=lambda i: i[1])

来自python docs关于关键参数:

  

key指定用于提取a的一个参数的函数   每个列表元素的比较键:key = str.lower。默认   value为None(直接比较元素)。

答案 1 :(得分:1)

您可以将this answer中的代码调整为另一个问题,以获得相对简单但快速的实现,如下所示:

class ValueOrderedDict(object):
    def __init__(self):
        self.d = {}
        self.L = []
        self.sorted = True
    def __getitem__(self, k):
        return self.d[k]
    def __setitem__(self, k, v):
        if k not in self.d:
            self.L.append((v, k))
            self.sorted = False
        self.d[k] = v
    def __delitem__(self, k):
        v = self.d[k]
        del self.d[k]
        self.L.remove((v, k))
    def __iter__(self):
       if not self.sorted:
           self.L.sort()
           self.sorted = True
       for v, k in self.L:
           yield k

vod = ValueOrderedDict()
vod['a'] = 10
vod['b'] =  5
vod['c'] = 20

for k in vod:
    print 'vod[{!r}]: {}'.format(k, vod[k])

输出:

vod['b']: 5
vod['a']: 10
vod['c']: 20