在Python中按键对字典列表进行排序

在Python中按键对字典列表进行排序,python,list,sorting,Python,List,Sorting,我有一个Python字典列表,每个字典只包含一个数字键,我想按它们的键对它们进行排序。 例如: list = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}] 我想对其进行排序并返回如下内容: [{1.0: 'a'}, {1.0: 'c'}, {.98: 'b'}, {.56: 'a'}] 在键值相同的情况下,我不在乎它们是如何排序的。我尝试过使用.sort()或.sorted(),但我在计算参数时遇到了问题。至少在Python 3.3中,@H

我有一个Python字典列表,每个字典只包含一个数字键,我想按它们的键对它们进行排序。 例如:

list = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}]
我想对其进行排序并返回如下内容:

[{1.0: 'a'}, {1.0: 'c'}, {.98: 'b'}, {.56: 'a'}]

在键值相同的情况下,我不在乎它们是如何排序的。我尝试过使用
.sort()
.sorted()
,但我在计算参数时遇到了问题。

至少在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()
函数进行排序


不幸的是,我们已经没有字典列表了,因此下一步是使用列表理解中的字典理解将元组列表转换回字典列表,将每个元组列表转换成字典,然后将它们作为列表一起返回。

使用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 2和3中起作用:

>>> 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
参数根据每个dict的最大键进行排序,在本例中,如果您只有一个dict,它将只是第一个dict

另一种解决方案可能有效,但这要简单得多


注意:永远不要用Python内置代码命名变量,比如
list

这是@dkamins的简化版本

>>> 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
的调用包装另一个函数,这样我们就可以省去它

排序(list,reverse=True)
应该这样做,
list
是一个全局函数,因此它不是变量名的好选择。我认为对您在这里所做的事情的准确解释将使这是一个极好的答案。这是在添加
参数之前进行此类排序的常用方法