Какие аргументы есть у функции Python sort ()?

Моя проблема в том, что я случайно установил аргументы для Main

static void Main (значение объекта)

благодаря моему инструменту рефакторинга. Принял пару минут, чтобы выяснить, но должен помочь кому-то по пути.

13
задан smci 24 April 2018 в 21:32
поделиться

3 ответа

Аргументы сортировки и сортировки

Оба сортировки и сортировки имеют три аргумента по ключевым словам: cmp, ключ и обратный.

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

Использование ключ и обратный предпочтительнее, так как они работают намного быстрее , чем эквивалент cmp. Клавиша

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

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

Explanation

>>> 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')]

Explanation

Sequences can contain any objects, even not comparable, but if we can define a function which creates something we can compare for each of the items, we can pass this function in key argument to sort or sorted.

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

После f= itemsgetter(2), вызов f(r) возвращает r[2]. Мини-штемпель, ключ против cmp

Просто из любопытства, ключ и 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

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

.
37
ответ дан 1 December 2019 в 06:53
поделиться

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

.
3
ответ дан 1 December 2019 в 06:53
поделиться

Да, для этого нужны другие аргументы, но нет значения -.

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

Что бы вообще означал аргумент -значение ?

.
1
ответ дан 1 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: