5

我正在按键对字典列表进行排序:

groups = sorted(groups, key=lambda a: a['name'])

一些字典的名称设置为None,并且 Python 2 将None值放在任何其他值之前,因此它们被放置在排序列表的前面。一个天真的修复将是

groups = sorted(groups, key=lambda a: a['name'] or 'zzzz')

但是,显然,这不适用于任何非拉丁名称。

None对包含值的列表进行排序以便将这些值放置在列表末尾的一种不错的 Pythonic 方式是什么?

4

2 回答 2

14

您可以通过在元组上键入它来做到这一点:

groups = sorted(groups, key=lambda a: (a['name'] is None, a['name']))

这是有效的,因为 Python 按字典顺序比较元组(在第一个元素上,然后在第二个元素上打破关系),并且因为 False 比 True 更早排序。组列表,例如

[{'name': 0}, {'name': 1}, {'name': 2}, {'name': 3}, {'name': 4}, {'name': None}]

会变成

[(False, 0), (False, 1), (False, 2), (False, 3), (False, 4), (True, None)]

以开头的元组True必然会在末尾结束,其余的,因为第一个值绑定,将按第二个值排序。

于 2013-11-08T21:29:46.900 回答
2

您可以创建自己的“无限”对象:

from functools import total_ordering

@total_ordering
class Infinity:
    def __eq__(self, other):
        return type(other) == Infinity
    def __lt__(self, other):
        return False

像这样使用它:

>>> lis = [{'name': 1}, {'name': None}, {'name': 0}, {'name': 2}]
>>> sorted(lis, key=lambda a: Infinity() if a['name'] is None else a['name'])
[{'name': 0}, {'name': 1}, {'name': 2}, {'name': None}]
于 2013-11-08T21:32:22.863 回答