我正在尝试使用对对象列表进行排序
my_list.sort(key=operator.attrgetter(attr_name))
但如果任何列表项有 attr = None
而不是 attr = 'whatever'
,
然后我得到一个 TypeError: unorderable types: NoneType() < str()
在 Py2 中这不是问题。我如何在 Py3 中处理这个问题?
原文由 AlexVhr 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试使用对对象列表进行排序
my_list.sort(key=operator.attrgetter(attr_name))
但如果任何列表项有 attr = None
而不是 attr = 'whatever'
,
然后我得到一个 TypeError: unorderable types: NoneType() < str()
在 Py2 中这不是问题。我如何在 Py3 中处理这个问题?
原文由 AlexVhr 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于通用解决方案,您可以定义一个比较小于任何其他对象的对象:
from functools import total_ordering
@total_ordering
class MinType(object):
def __le__(self, other):
return True
def __eq__(self, other):
return (self is other)
Min = MinType()
然后使用排序键替换 Min
列表中的任何 None
值
mylist.sort(key=lambda x: Min if x is None else x)
原文由 augurar 发布,翻译遵循 CC BY-SA 3.0 许可协议
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
排序比较运算符对 Python 3 中 的 类型更加严格,如下所述:
Python 2 排序
None
在任何字符串(甚至是空字符串)之前:在 Python 3 中,任何排序
NoneType
实例的尝试都会导致异常:我能想到的最快解决方法是将
None
实例显式映射到可订购的对象中,例如""
:如果您想在保持数据完整的同时对数据进行排序,只需提供
sort
一个自定义的key
方法: