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

3

我有一个包含许多只有一个数字键的字典列表,我想按照它们的键进行排序。

例如:

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

我希望对此进行排序并返回类似以下的结果:
[{1.0: 'a'}, {1.0: 'c'}, {.98: 'b'}, {.56: 'a'}]

如果关键值相同,我不在乎它们如何排序。我试过使用 .sort().sorted(),但无法弄清楚参数。


3
sorted(list, reverse=True) 可以解决问题。 - Hai Vu
顺便提一下,list是一个全局函数,因此不适合作为变量名。 - twasbrillig
4个回答

3
这是@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 函数时包装了另一个函数,因此我们可以省略它。


2
这将适用于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'}]

它使用sortedkey参数,根据每个字典的最大键进行排序,在这种情况下,如果只有一个,则仅为第一个键。另一种解决方案可能有效,但这更加简单明了。附注:永远不要以Python内置名称(如list)命名变量。

1

对于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'}]

0

至少在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()函数进行排序。
不幸的是,我们不再有字典列表,因此下一步是将从元组列表的列表转换回字典列表,使用字典推导式在列表推导式中将每个元组列表转换为字典,然后将它们全部作为列表返回。

我认为对你在这里做的事情进行详细解释会使这个答案更加出色。 - bwegs
2
这是一个 Schwartzian_transform。在 key 参数被添加之前,这是一种常见的排序方式。 - John La Rooy

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