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