Python:OrderedDictionary基于键值的长度排序

时间:2012-10-15 22:33:10

标签: python python-2.7 sorting dictionary ordereddictionary

我有一个这样的对象:

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

带有随机键(字符串和/或整数)的字典,其中所有列表都作为值,具有不同的大小。

我想将此字典转换为OrderedDict,它根据字典项列表的长度进行排序。所以订购后我想得到:

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

(如果两个或多个项目具有相同的值,则它们的顺序并不重要。

我试过了,但我失败了:

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

我不是经历,如果我尝试的是超级愚蠢的话,请原谅我。

我该怎么办?

谢谢。

4 个答案:

答案 0 :(得分: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'])])

答案 1 :(得分:5)

您实际上与传递给sorted的排序功能非常接近。需要注意的是,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,因为您只需使用最新的字典数据迭代新的排序列表。

答案 2 :(得分:3)

由于有序字典会记住其插入顺序,因此您可以这样做:

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

答案 3 :(得分:1)

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

如果您只需按排序顺序获取所有项目,则可以执行以下操作:

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

但是,您仍在使用未排序的数据结构 - 只是按排序顺序迭代它。这仍然不支持查找第k个元素或dict中元素的后继元素或前驱元素等操作。