25 ноября 2010 г.

Умная сортировка списков

Для большинства случаев за глаза хватает стандартной функции сортировки списков и кортежей, 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]

blog comments powered by Disqus