繁体   English   中英

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

[英]How to iterate through keys of a dictionary which is sorted with values?

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

码:

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) 

将只给我排序的值列表而不是整个字典与排序值,所以我不能在这里有键。

使用dict.iteritems从dict获取元组列表并使用sorted

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

从关于关键参数的python docs

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM