我有一个包含许多只有一个数字键的字典列表,我想按照它们的键进行排序。
例如:
list = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}]
我希望对此进行排序并返回类似以下的结果:
[{1.0: 'a'}, {1.0: 'c'}, {.98: 'b'}, {.56: 'a'}]
如果关键值相同,我不在乎它们如何排序。我试过使用 .sort()
或 .sorted()
,但无法弄清楚参数。
>>> lst = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}]
>>> sorted(lst, key=max, reverse=True)
[{1.0: 'a'}, {1.0: 'c'}, {0.98: 'b'}, {0.56: 'a'}]
请回忆一下,max(d.keys())
返回的结果和 max(d)
相同。
lambda d: max(d)
只是在调用 max
函数时包装了另一个函数,因此我们可以省略它。
>>> mylist = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}]
>>> sorted(mylist, key=lambda d: max(d.keys()), reverse=True)
[{1.0: 'a'}, {1.0: 'c'}, {0.98: 'b'}, {0.56: 'a'}]
sorted
的key
参数,根据每个字典的最大键进行排序,在这种情况下,如果只有一个,则仅为第一个键。另一种解决方案可能有效,但这更加简单明了。附注:永远不要以Python内置名称(如list
)命名变量。对于Python 3+,根据 @Simon 的说法,它会抛出错误。这取决于您的词典是否为单例模式:
>>> lst = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}]
>>> sorted(lst, key=lambda d: d.keys()[0], reverse=True)
[{1.0: 'a'}, {1.0: 'c'}, {0.98: 'b'}, {0.56: 'a'}]
至少在Python 3.3中,@Hai Vu的评论不起作用,因为它会引发类型错误,因为dict()不是可排序类型。但是,如果我们可以将字典转换为可排序类型,例如元组列表,那么该评论提供了一个答案:
>>>> L = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}]
>>>> L2 = sorted([list(zip(x.keys(),x.values())) for x in L],reverse=True)
>>>> L2
[[(1.0, 'c')], [(1.0, 'a')], [(0.98, 'b')], [(0.56, 'a')]]
>>>> [{k: v for (k,v) in x} for x in L2]
[{1.0: 'c'}, {1.0: 'a'}, {0.98: 'b'}, {0.56: 'a'}]
L
而不是list
,以避免与list
关键字混淆。然后,我们使用列表推导式创建一个元组列表的列表,其中每个子列表都是每个字典的键和值一起压缩的结果。作为列表,它们可以通过sorted()
函数进行排序。
sorted(list, reverse=True)
可以解决问题。 - Hai Vulist
是一个全局函数,因此不适合作为变量名。 - twasbrillig