在Python中按键排序字典列表

时间:2014-11-14 00:59:11

标签: 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(),但我无法弄清楚这些论点。

4 个答案:

答案 0 :(得分: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包含另一个函数,因此我们可以将其保留

答案 1 :(得分: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'}]

它使用sorted的{​​{1}}参数根据每个dict的最大键进行排序,在这种情况下,如果你只有一个,那么它就是第一个。

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

P.S。不要在Python内置key之后命名变量。

答案 2 :(得分: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'}]

答案 3 :(得分: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()函数对它们进行排序。

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