Для большинства случаев за глаза хватает стандартной функции сортировки списков и кортежей, sort
, но иногда и бывают варианты.
Сегодня мне понадобилось при сортировке списка пустые значения отбрасывать в конец списка и все бы было просто, но стандартным поведением Python является оставление пустых значений в начале списка. Страшно? Не особо, ведь мы всегда можем воспользоваться кастомной функцией для сортировки значений cmp
, чем я и воспользовался.
>>> sorted(['First', None, 'Second', None, 'Third'])
[None, None, 'First', 'Second', 'Third']
>>> def smart_cmp(x, y):
... if x and y:
... return cmp(x, y)
... elif not x and not y:
... return 0
... elif x:
... return -1
... return 1
...
>>> sorted(['First', None, 'Second', None, 'Third'], cmp=smart_cmp)
['First', 'Second', 'Third', None, None]
>>> sorted([None, 'First', None, None, 'Third', None, 'Second', None, 'fourth'], cmp=smart_cmp)
['First', 'Second', 'Third', 'fourth', None, None, None, None]