Пользовательская сортировка списка Python
Я пересматривал старый код и сталкивался с этим:
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
Работает код (и я написал его около 3 лет назад!), но я не могу найти эту вещь в любом месте документа Python, и каждый использует sorted()
для реализации пользовательской сортировки. Может кто-нибудь объяснить, почему это работает?
Ответы
Ответ 1
Здесь описано .
Метод sort() принимает необязательные аргументы для управления сравнения.
cmp задает пользовательскую функцию сравнения из двух аргументов (список пункты), которые должны возвращать отрицательное, ноль или положительное число в зависимости от того, считается ли первый аргумент меньшим, равный или больше второго аргумента: cmp = lambda x, y: cmp (x.lower(), y.lower()). Значение по умолчанию: None.
Ответ 2
В качестве побочного примечания, здесь есть лучшая альтернатива для реализации той же сортировки:
alist.sort(key=lambda x: x.foo)
Или, альтернативно:
import operator
alist.sort(key=operator.attrgetter('foo'))
Посмотрите Сортировка How To, это очень полезно.
Ответ 3
Как и в этом примере. Вы хотите отсортировать этот список.
[('c', 2), ('b', 2), ('a', 3)]
выход:
[('a', 3), ('b', 2), ('c', 2)]
вы должны отсортировать два элемента и первый
def letter_cmp(a, b):
if a[1] > b[1]:
return -1
elif a[1] == b[1]:
if a[0] > b[0]:
return 1
else:
return -1
else:
return 1
Наконец:
just sort(letter_cmp)