2021-05-18 14:24:20
«Отнаследовать» функцию от существующейНекоторые справедливо заметили, что если формат исходной строки заранее известен, то отсортировать список можно через стандартную sorted():
data = [
"4 - Дуглас",
"2 - Клер",
"11 - Зоя",
"1 - Френк",
"31 - Питер",
]
def _key(src):
parts = src.partition(" - ")
return int(parts[0])
>>> sorted(data, key=_key)
['1 - Френк', '2 - Клер', '4 - Дуглас', '11 - Зоя', '31 - Питер']
Чтобы добавить семантичности и не таскать везде дополнительный параметр key, можно создать собственную функцию на основе sorted():
def natsorted(iterable, reverse=False):
return sorted(iterable, key=_key, reverse=reverse)
>>> natsorted(data)
['1 - Френк', '2 - Клер', '4 - Дуглас', '11 - Зоя', '31 - Питер']
Есть и более лакончиный способ сделать это — через functools.partial():
import functools
natsorted = functools.partial(sorted, key=_key)
partial() создает новую функцию* на основе существующей. При этом можно «зафиксировать» один или несколько параметров (мы зафиксировали key), разрешив менять остальные (iterable и reverse в нашем случае).
Таким образом, partial() помогает создавать узкоспециализированные функции на базе более универсальных.
* Строго говоря, не функцию, а вызываемый объект, у которого определен дандер __call__ — его можно вызывать, как будто это функция.
177 viewsЕгор, 11:24