Какие аргументы имеет функция сортировки Python?

Есть ли другой аргумент, кроме key, например: value?

Спасибо.

Ответ 1

Аргументы sort и sorted

Оба sort и sorted имеют три аргумента ключевых слов: cmp, key и reverse.

L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1

sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

Использование key и reverse является предпочтительным, поскольку они работают намного быстрее, чем эквивалент cmp.

key должна быть функцией, которая принимает элемент и возвращает значение для сравнения и сортировки. reverse позволяет отменить порядок сортировки.

Использование аргумента key

Вы можете использовать operator.itemgetter как ключевой аргумент для сортировки вторым, третьим и т.д. в кортеже.

Пример

>>> from operator import itemgetter

>>> a = range(5)
>>> b = a[::-1]
>>> c = map(lambda x: chr(((x+3)%5)+97), a)
>>> sequence = zip(a,b,c)

# sort by first item in a tuple
>>> sorted(sequence, key = itemgetter(0))
[(0, 4, 'd'), (1, 3, 'e'), (2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c')]

# sort by second item in a tuple
>>> sorted(sequence, key = itemgetter(1))
[(4, 0, 'c'), (3, 1, 'b'), (2, 2, 'a'), (1, 3, 'e'), (0, 4, 'd')]

# sort by third item in a tuple
>>> sorted(sequence, key = itemgetter(2))
[(2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c'), (0, 4, 'd'), (1, 3, 'e')]

Объяснение

Последовательности могут содержать любые объекты, даже не сравнимые, но если мы сможем определить функцию, которая производит что-то, что мы можем сравнить для каждого из элементов, мы можем передать эту функцию в аргументе key до sort или sorted.

itemgetter, в частности, создает такую ​​функцию, которая извлекает данный элемент из своего операнда. Пример из документации:

После f=itemgetter(2) вызов f(r) возвращает r[2].

Mini-benchmark, key vs cmp

Просто из любопытства, производительность key и cmp сравнима, меньше - лучше:

>>> from timeit import Timer
>>> Timer(stmt="sorted(xs,key=itemgetter(1))",setup="from operator import itemgetter;xs=range(100);xs=zip(xs,xs);").timeit(300000)
6.7079150676727295
>>> Timer(stmt="sorted(xs,key=lambda x:x[1])",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000)
11.609490871429443
>>> Timer(stmt="sorted(xs,cmp=lambda a,b: cmp(a[1],b[1]))",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000)
22.335839986801147

Итак, сортировка с key кажется, по крайней мере, в два раза быстрее, чем сортировка с помощью cmp. Использование itemgetter вместо lambda x: x[1] делает сортировку еще быстрее.

Ответ 2

Помимо key=, метод списков sort может альтернативно принимать аргумент cmp= (не), он был удален в Python 3); с любым из них или ни с одним из этих двух, вы всегда можете передать reverse=True, чтобы сортировка была направлена ​​вниз (вместо того, чтобы вверх, как и по умолчанию, и которую вы также можете запросить явно с помощью reverse=False, если вы действительно хотите это сделать по какой-то причине). Я не знаю, что должен делать этот аргумент value, который вы упоминаете.

Ответ 3

Да, он принимает другие аргументы, но не value.

>>> print list.sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1

Что может означать аргумент value?