2012-10-15 54 views
3

的长度我有一个这样的对象:的Python:OrderedDictionary排序基于键的值

t = {'rand_key_1': ['x'], 'rand_key_2': [13,23], 'rand_key_3': [(1)], 'rk5': [1,100,3,4,3,3]} 

与随机密钥(串和/或INT),其都具有一个列表作为值,具有不同的字典大小。

我想把这个字典变成一个OrderedDict,它的排序取决于字典项目列表的长度。所以订货后,我想:

t_ordered = {'rk5': ..., 'rand_key_2': .., 'rand_key_1': .., 'rand_key_3': ..} 

(如果有两个或多个项目具有相同的价值,他们的顺序并不真正重要

我试过,但我没有。

OrderedDict(sorted(d, key=lambda t: len(t[1]))) 

我没有经验,所以原谅我,如果我做的尝试是超级笨。

我该怎么办?

谢谢。

回答

5

你实际上非常接近你传递给sorted的排序函数。要注意的是,排序将按顺序返回字典的可读性。因此,如果我们解决您的功能指标与每个键的字典:

>>> sorted(t, key=lambda k: len(t[k])) 
['rand_key_3', 'rand_key_1', 'rand_key_2', 'rk5'] 

你也可以指定键以相反的顺序返回,并直接遍历这些键:

>>> for sorted_key in sorted(t, key=lambda k: len(t[k]), reverse=True): 
...  print sorted_key, t[sorted_key] 

rk5 [1, 100, 3, 4, 3, 3] 
rand_key_2 [13, 23] 
rand_key_3 [1] 
rand_key_1 ['x'] 

通常你止跌不需要创建OrderedDict,因为您只需使用最新的字典数据遍历新的排序列表。

+0

谢谢Hardbyte。必须是我阅读过的最好答案之一。很好的解释。我想,我真的明白了。非常感谢! – Phil

3

因为一个有序字典记得它的插入顺序,所以你可以这样做:

OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
+1

我想你想t [1]按键值的长度排序;这根据密钥的长度来分类。 – schodge

5

使用简单的字典排序,然后再使用OrderedDict()

>>> from collections import OrderedDict as od 
>>> k=sorted(t, key=lambda x:len(t[x]), reverse=True) 
>>> k 
['rk5', 'rand_key_2', 'rand_key_3', 'rand_key_1'] 

>>> od((x, t[x]) for x in k) 
OrderedDict([('rk5', [1, 100, 3, 4, 3, 3]), ('rand_key_2', [13, 23]), ('rand_key_3', [1]), ('rand_key_1', ['x'])]) 
+0

你好Ashwini。感谢您的帮助。这不是我想要的,但是因为这是不可能的(我的内心渴望的),我会用你的第一个解决方案来使用它,就像一把钥匙一样按顺序迭代并从字典中打印。 – Phil

1

OrderedDict在Python是一种集合记住项目插入的顺序。在这种情况下排序并不意味着排序。

如果你需要的,就是以有序的所有项目,你可以做这样的事情:

for key, value in sorted(t, key = lambda x: -len(x[0])): 
    # do something with key and value 

但是,你仍然在使用一个未排序的数据结构 - 只是遍历它的排序顺序。这仍然不支持查找第k个元素或dict中元素的后继或前任操作。