按照字典值对字典列表进行排序

6

我有以下字典列表

a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}]

我如何进行排序以获得以下结果:
a = [{43:123}, {3:103}, {36:103}, {2:102}, {23:100}]

我的意思是,按照字典值的大小对列表进行降序排序。


1
这些字典都有不同的键。是否有更好的数据类型适用于此? - tlunter
5个回答

6
除了brandizzi的回答外,你也可以选择以下方法:
sorted(a, key=dict.values, reverse=True)

大致相同,但可能更符合习惯用语。

+1 我同意,除非问题规定只能使用第一个项目进行排序,否则这是更好的答案。 - jamylak
嘿,我该如何从已排序的 a 字典中提取值以获得整数? 例如:for b in a: print a[i].keys() i+=1但是Python仍然显示它是一个列表,我需要获得整数。我该怎么做? - user1403568
@user1403568 尝试使用 for b in a: print b.keys()[0]。这将提取键,因此您最终将打印出:43、3、36、2、23。如果您想要值(如123、103、36、102、100),请使用 b.values()[0] - Hod - Monica's Army
我是唯一一个遇到错误的人吗:'<' not supported between instances of 'dict_values' and 'dict_values' - roschach
@FrancescoBoi,你是怎么解决那个错误的? - Viet Than

3
>>> sorted(a, key=lambda i: i.values()[0], reverse=True)
[{43: 123}, {3: 103}, {36: 103}, {2: 102}, {23: 100}]

1
在Python 3中,其他答案不再适用,因为dict.values()现在返回一个字典视图对象而不是列表。要从视图对象中提取值,我们可以使用iternext的组合:
a.sort(key=lambda dic: next(iter(dic.values())), reverse=True)

+1 是因为我认为这个问题不应该被踩。然而,我并不认为这与 @KurzedMetal 的解决方案有什么实质性的区别。我不认为 list.sortsorted(list) 值得有两种不同的解决方案。 - jpp
1
@jpp 问题在于itervalues在py3中不存在。我想我本可以编辑那个答案,但那将是一个相当大的编辑,需要包括到iternext的链接等等。 - Aran-Fey

1

您可以向list.sort()方法传递一个key参数,这样比较将根据key返回的值进行:

>>> a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}]
>>> a.sort(key=lambda d: d.values()[0], reversed=True)
>>> a
[{23: 100}, {2: 102}, {3: 103}, {36: 103}, {43: 123}]

在这种情况下,关键是一个接收字典 d 并使用 .values() 获取其值列表的函数。由于只有一个值,我们从返回的列表中获取此唯一值。然后,list.sort() 方法将比较这些返回的值而不是字典本身进行排序。

这个代码提供了一个按升序排序的结果,但是OP想要降序。 - raym0nd
2
@raym0nd 好的,已经修复了。虽然我必须说,我更喜欢 HodfHod 的解决方案 :) - brandizzi

0

我宁愿使用(或至少记住).itervalues()

In [25]: sorted(a, key=lambda x: next(x.itervalues()), reverse=True)
Out[25]: [{43: 123}, {36: 103}, {2: 102}, {23: 100}, {3: 103}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接