当值为 None 或空字符串 python 时排序
Sort when values are None or empty strings python
我有一个包含字典的列表,我在其中按不同的值对它们进行排序。我正在用这些代码行来做:
def orderBy(self, col, dir, objlist):
if dir == 'asc':
sorted_objects = sorted(objlist, key=lambda k: k[col])
else:
sorted_objects = sorted(objlist, key=lambda k: k[col], reverse=True)
return sorted_objects
现在的问题是,当我尝试排序时,我偶尔会遇到空值或空字符串,然后一切都崩溃了。
我不确定,但我认为这是抛出的异常:不可排序的类型:NoneType() < NoneType()。当我要排序的列上有 None 个值时,就会发生这种情况。对于空字符串值,它可以工作,尽管它们在列表中排在第一位,但我希望它们排在最后。
我该如何解决这个问题?
如果您希望 None
和 ''
值出现在最后,您可以让 key
函数 return 一个元组,这样列表按该元组的自然顺序。元组的形式为 (is_none, is_empty, value)
;这样,None
值的元组将是 (1, 0, None)
,''
的元组是 (0, 1, '')
,其他任何值的元组将是 (0, 0, "anything else")
。因此,这将首先对正确的字符串进行排序,然后是空字符串,最后是 None
.
示例:
>>> list_with_none = [(1,"foo"), (2,"bar"), (3,""), (4,None), (5,"blub")]
>>> col = 1
>>> sorted(list_with_none, key=lambda k: (k[col] is None, k[col] == "", k[col]))
[(2, 'bar'), (5, 'blub'), (1, 'foo'), (3, ''), (4, None)]
我有一个包含字典的列表,我在其中按不同的值对它们进行排序。我正在用这些代码行来做:
def orderBy(self, col, dir, objlist):
if dir == 'asc':
sorted_objects = sorted(objlist, key=lambda k: k[col])
else:
sorted_objects = sorted(objlist, key=lambda k: k[col], reverse=True)
return sorted_objects
现在的问题是,当我尝试排序时,我偶尔会遇到空值或空字符串,然后一切都崩溃了。
我不确定,但我认为这是抛出的异常:不可排序的类型:NoneType() < NoneType()。当我要排序的列上有 None 个值时,就会发生这种情况。对于空字符串值,它可以工作,尽管它们在列表中排在第一位,但我希望它们排在最后。
我该如何解决这个问题?
如果您希望 None
和 ''
值出现在最后,您可以让 key
函数 return 一个元组,这样列表按该元组的自然顺序。元组的形式为 (is_none, is_empty, value)
;这样,None
值的元组将是 (1, 0, None)
,''
的元组是 (0, 1, '')
,其他任何值的元组将是 (0, 0, "anything else")
。因此,这将首先对正确的字符串进行排序,然后是空字符串,最后是 None
.
示例:
>>> list_with_none = [(1,"foo"), (2,"bar"), (3,""), (4,None), (5,"blub")]
>>> col = 1
>>> sorted(list_with_none, key=lambda k: (k[col] is None, k[col] == "", k[col]))
[(2, 'bar'), (5, 'blub'), (1, 'foo'), (3, ''), (4, None)]