首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将列表与"Nones list“排序

如何将列表与"Nones list“排序
EN

Stack Overflow用户
提问于 2013-11-08 21:25:38
回答 2查看 607关注 0票数 5

我正在按一个键对一组数据进行排序:

代码语言:javascript
复制
groups = sorted(groups, key=lambda a: a['name'])

有些dicts的名称被设置为None,Python2将None值放在任何其他值之前,因此它们位于排序列表的前面。一个天真的解决办法就是

代码语言:javascript
复制
groups = sorted(groups, key=lambda a: a['name'] or 'zzzz')

但是,很明显,这对任何非拉丁语的名字都行不通。

如何对包含None值的列表进行排序,以便将这些值放在列表的末尾,这是一种很好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-08 21:29:46

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

代码语言:javascript
复制
groups = sorted(groups, key=lambda a: (a['name'] is None, a['name']))

这是因为Python在字典上比较元组(在第一个元素上,然后在第二个元素上中断联系),并且False排序早于True。这样的组的列表

代码语言:javascript
复制
[{'name': 0}, {'name': 1}, {'name': 2}, {'name': 3}, {'name': 4}, {'name': None}]

会变成

代码语言:javascript
复制
[(False, 0), (False, 1), (False, 2), (False, 3), (False, 4), (True, None)]

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

票数 14
EN

Stack Overflow用户

发布于 2013-11-08 21:32:22

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

代码语言:javascript
复制
from functools import total_ordering

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

用它就像这样:

代码语言:javascript
复制
>>> 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}]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19868767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档