【问题标题】:How to iterate through keys of a dictionary which is sorted with values?如何遍历按值排序的字典的键?
【发布时间】:2014-04-07 07:38:37
【问题描述】:

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

代码:

from collections import OrderedDict

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

for mykey in data:
    print mykey

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

sorted(dictionary.values) 

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

【问题讨论】:

标签: python python-2.7


【解决方案1】:

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

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

来自 python docs 关于关键参数:

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

【讨论】:

  • for mykey in sorted(data.items(), key=lambda i: i[1]): print mykey //它的打印元组,我要打印密钥
  • @Patrick 将其更改为:for key, value in sorted(...): print key
【解决方案2】:

您可以将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

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2023-03-04
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多