按值排序字典列表

时间:2016-02-29 23:29:03

标签: python dictionary

我有一个字典列表,其格式为:

neighbour_list = [{1:4}, {3:5}, {4:9}, {5:2}]

我需要按照具有最大值的字典顺序对列表进行排序。因此,对于上面的代码,排序列表看起来像:

sorted_list = [{4:9}, {3:5}, {1:4}, {5:2}]

列表中的每个字典只有一个映射。

有一种有效的方法吗?目前我循环遍历列表以获得最大值,然后记住它被发现返回最大值的位置,但我不知道如何扩展它以便能够对整个列表进行排序。

实现我自己的dict类会更容易吗?

编辑:这是我的代码,用于返回应该在理想排序列表中“首先”的字典。

temp = 0
element = 0

for d in list_of_similarities:
    for k in d:
        if (d[k] > temp):
            temp = d[k]
            element = k
            dictionary = d

first = dictionary[element]

2 个答案:

答案 0 :(得分:3)

您可以使用匿名函数作为排序键来提取dict值(不确定我是否以最有效的方式完成此操作:

sorted(neighbour_list, key = lambda x: tuple(x.values()), reverse=True)
[{4: 9}, {3: 5}, {1: 4}, {5: 2}]

注意我们需要将x.values()强制转换为元组,因为在Python 3中,x.values()的类型为“dict_values”,这是无法解决的。我想这个想法是dict更像是一个集合而不是一个列表(因此是花括号),并且集合上没有(良好)排序;你不能使用通常的词典排序,因为没有“第一元素”,“第二元素”等概念。

答案 1 :(得分:3)

您可以使用dict值作为键list.sort

neighbour_list.sort(key=lambda x: x.values(), reverse=1)

考虑到你只有一个值,对于python2,你可以在itervalues上调用next来获得第一个也是唯一的值:

neighbour_list.sort(key=lambda x: next(x.itervalues()), reverse=1)
print(neighbour_list)

对于python3,你不能在dict.values上调用下一个,它必须是:

neighbour_list.sort(key=lambda x: next(iter(x.values())), reverse=1)

并且必须在list上致电dict.values

neighbour_list.sort(key=lambda x: list(x.values()), reverse=1)