我想迭代使用值排序的字典的键。一种方法是使用有序字典意味着用排序值初始化字典。
代码:
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)
只会给我排序的值列表,而不是整个字典的排序值,所以我不能在这里输入密钥。
答案 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