繁体   English   中英

在Python中按键排序字典列表

[英]Sorting a list of dictionaries by key in Python

我在Python中有一个字典列表,每个字典只包含一个数字键,我想按键排序。 例:

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

我想对此进行排序并返回如下内容:

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

在键值相同的情况下,我不关心它们是如何排序的。 我尝试过使用.sort().sorted() ,但是我无法弄清楚这些论点。

这是@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调用周围包含另一个函数,所以我们可以把它留下来

这将适用于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参数根据每个dict的最大键进行排序,在这种情况下,如果你只有一个,它就是第一个。

另一种解决方案可能有效,但这更直截了当。

PS在像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()

不幸的是,我们不再有字典列表,所以下一步是使用列表理解中的字典理解将元组列表转换回字典列表,将每个元组列表转换为字典然后将它们作为列表一起返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM