将“无”值推到结尾时的排序列表

我有一个同构的对象列表,其中包含 Nothing,但它可以包含任何类型的值。 例如:

>>> l = [1, 3, 2, 5, 4, None, 7]
>>> sorted(l)
[None, 1, 2, 3, 4, 5, 7]
>>> sorted(l, reverse=True)
[7, 5, 4, 3, 2, 1, None]

有没有一种不需要重造轮子就可以按照通常的 python 方式对列表进行排序的方法,但是在列表的末尾加上 None 值,就像这样:

[1, 2, 3, 4, 5, 7, None]

我觉得这里可以有一些把戏与“键”参数

35023 次浏览

试试这个:

sorted(l, key=lambda x: float('inf') if x is None else x)

因为无穷大比所有的整数都大,所以 None总是放在最后。

>>> l = [1, 3, 2, 5, 4, None, 7]
>>> sorted(l, key=lambda x: (x is None, x))
[1, 2, 3, 4, 5, 7, None]

这将为列表中的每个元素构造一个元组,如果值是 None,那么元组就是 (True, None),如果值是其他值,那么它就是 (False, x)(其中 x是值)。由于元组是逐项排序的,这意味着所有非 None元素将首先出现(自 False < True以来) ,然后按值排序。

我创建了一个函数,扩展了 Andrew Clark 的答案和 tutuDajuju 的评论。

def sort(myList, reverse = False, sortNone = False):
"""Sorts a list that may or may not contain None.
Special thanks to Andrew Clark and tutuDajuju for how to sort None on https://stackoverflow.com/questions/18411560/python-sort-list-with-none-at-the-end


reverse (bool) - Determines if the list is sorted in ascending or descending order


sortNone (bool) - Determines how None is sorted
- If True: Will place None at the beginning of the list
- If False: Will place None at the end of the list
- If None: Will remove all instances of None from the list


Example Input: sort([1, 3, 2, 5, 4, None, 7])
Example Input: sort([1, 3, 2, 5, 4, None, 7], reverse = True)
Example Input: sort([1, 3, 2, 5, 4, None, 7], reverse = True, sortNone = True)
Example Input: sort([1, 3, 2, 5, 4, None, 7], sortNone = None)
"""


return sorted(filter(lambda item: True if (sortNone != None) else (item != None), myList),
key = lambda item: (((item is None)     if (reverse) else (item is not None)) if (sortNone) else
((item is not None) if (reverse) else (item is None)), item),
reverse = reverse)

下面是一个如何运行它的例子:

myList = [1, 3, 2, 5, 4, None, 7]
print(sort(myList))
print(sort(myList, reverse = True))
print(sort(myList, sortNone = True))
print(sort(myList, reverse = True, sortNone = True))
print(sort(myList, sortNone = None))
print(sort(myList, reverse = True, sortNone = None))