我有一个字典列表,其格式为:
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]
答案 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)