我正在按一个键对一组数据进行排序:
groups = sorted(groups, key=lambda a: a['name'])有些dicts的名称被设置为None,Python2将None值放在任何其他值之前,因此它们位于排序列表的前面。一个天真的解决办法就是
groups = sorted(groups, key=lambda a: a['name'] or 'zzzz')但是,很明显,这对任何非拉丁语的名字都行不通。
如何对包含None值的列表进行排序,以便将这些值放在列表的末尾,这是一种很好的方法吗?
发布于 2013-11-08 21:29:46
您可以通过在元组上键入它来做到这一点:
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-08 21:32:22
您可以创建自己的“无限”对象:
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}]https://stackoverflow.com/questions/19868767
复制相似问题