排序包含列表的字典

时间:2014-08-18 05:58:51

标签: python list sorting dictionary

假设我有以下列表清单:

dict1 = [['Jeremy', 25, 120000], ['Paul', 23, 75000], ['Mike', 32, 80000]]

我可以轻松对索引2上的列表进行排序,如下所示:

from operator import itemgetter

sorted_dict = sorted(dict1, key=itemgetter(1))
print(sorted_dict)
>>>
[['Paul', 23, 75000], ['Jeremy', 25, 120000], ['Mike', 32, 80000]]

使用列表字典会让事情变得复杂一些。假设我有以下内容:

dict2 = {'employee1':['Paul', 23, 75000], 
         'employee2':['Mike', 32, 80000], 
         'employee3':['Jeremy', 25, 120000]}

我可以对索引2进行近似排序,如下所示:

from operator import itemgetter

#First, extract lists
result1 = dict2.values()
#Second, sort list by index 2
result2 = sorted(result1, key=itemgetter(1))
#Finally, use for loop to sort dictionary
for a in result2:
    for b in dict2.keys():
        if a == dict2[b]:
            print("{0}:{1}".format(b,a))

>>>
   employee1:['Paul', 23, 75000]
   employee3:['Jeremy', 25, 120000]
   employee2:['Mike', 32, 80000]

我想要一种更好的方法来对字典进行排序。我在排序字典(here)上找到了一个社区wiki帖子,但该帖子中的字典有常量键。在上面的字典中,每个列表都有一个唯一的密钥。

感谢。

使用Python 3.4.1

2 个答案:

答案 0 :(得分:2)

首先,您无法对dict进行排序,因为它没有订单 1 。您可以对其项目进行排序:

sorted(d.items(), key=lambda t: t[1][1])

应该做的伎俩。

注释

  • t[1] # => the "value", t[0] is the "key"
  • t[1][1] # => The second element in the value.

您将获得一个2元组列表(其中第一个元素是键,第二个元素是值)。当然,你总是可以将这个2元组列表直接传递给collections.OrderedDict,如果你想构建一个事后排序的字典......

1 更准确地说,订单是任意并且可能会根据键插入,删除,python实现或版本...而改变(这就是为什么它的原因)更容易说dict是无序的)

答案 1 :(得分:1)

您可以对键进行排序并使用有序键创建另一个dict

>>>>from collections import OrderedDict
>>>>dict2 = {'employee1':['Paul', 23, 75000], 
     'employee2':['Mike', 32, 80000], 
     'employee3':['Jeremy', 25, 120000]}

>>>>OrderedDict([
        #new item: ordered key, it's value form original dict
        ( x, dict2[x]) 
        #sort keys of original dict
        for x in sorted(dict2, key=lambda x: dict2[x][1])
])
OrderedDict([('employee1', ['Paul', 23, 75000]), ('employee3', ['Jeremy', 25, 120000]), ('employee2', ['Mike', 32, 80000])])