Какие аргументы имеет функция Python sort ()?
есть ли другой аргумент, кроме key
, например: value
?
3 ответов
доводы 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')]
объяснение
последовательности могут содержать любые объекты, даже не сопоставимые, но если мы можем определить функцию, которая производит что-то, что мы можем сравнить для каждого из элементов, мы можем передать эту функцию в до sort
или sorted
.
itemgetter
, в частности, создает такую функцию, что извлекает данный элемент из его операнда. Пример из его документации:
после
f=itemgetter(2)
вызовf(r)
возвращаетr[2]
.
мини-тест, 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]
делает вроде еще быстрее.
Да, это требует других аргументов, но нет value
.
>>> print list.sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
что бы