Как работает пользовательский ключ сортировки?

Мне было интересно, как считается значение item1 и item2?

import functools

lst = [ 2, 1, 3, 6,0, 4, 5]

def compare(item1, item2):
    print item1, item2
    return (item1) - (item2)


print lst
sorted(lst, key=functools.cmp_to_key(compare))

Результат приведен ниже

[2, 1, 3, 6, 0, 4, 5]
1 2    
3 1
3 2
6 2
6 3
0 3
0 2
0 1
4 2
4 6
4 3
5 3
5 6
5 4
Out[25]: [0, 1, 2, 3, 4, 5, 6]

Я хочу знать, как и на каком основании считаются значения item1 и item2?


person Rajat Raj    schedule 26.11.2017    source источник
comment
Вы проверили документацию? В нем объясняется, что такое функция сравнения в старом стиле, что такое ключевая функция и как functools.cmp_to_key преобразуется между ними.   -  person Adam Smith    schedule 26.11.2017
comment
@AdamSmith Я прочитал это. В нем упоминается только то, что два аргумента берутся, а затем сравниваются. Мой вопрос в том, как эти два аргумента принимаются?   -  person Rajat Raj    schedule 26.11.2017
comment
Чтобы узнать, как на самом деле работает cmp_to_key, см. здесь.   -  person Sebastian Mendez    schedule 26.11.2017
comment
@RajatRaj, что ты имеешь в виду? Алгоритмически? Python реализует Timsort, названный так в честь его разработчика Тим Питерс   -  person Adam Smith    schedule 26.11.2017
comment
@AdamSmith Да, я знаю, что python реализует сортировку с использованием timsort. Когда мы передаем пользовательскую функцию функции сортировки, она рассматривает передачу двух элементов одновременно в качестве аргумента. Я отобразил значения item1 и item2 в своем вопросе. Я хочу знать, как учитываются эти элементы.   -  person Rajat Raj    schedule 26.11.2017
comment
@RajatRaj использование вами рассматриваемого здесь слова неясно. Они сравниваются с использованием функции компаратора, которую вы определили как compare, пройдя через functool.cmp_to_key, определение которой вы сказали, что прочитали. Если вы спрашиваете, почему он сравнивает два сравниваемых элемента и почему именно в таком порядке, ну, я думал, вы сказали, что знаете, что Python реализует Timsort, потому что это алгоритм, которому он следует. Потратьте полчаса и еще раз прочитайте две ссылки, которые я вам оставил, потому что они отвечают на все вопросы, которые у вас могут возникнуть по этой теме.   -  person Adam Smith    schedule 26.11.2017
comment
@AdamSmith Спасибо за помощь. Я обязательно подумаю о том, чтобы их прочитать.   -  person Rajat Raj    schedule 26.11.2017
comment
(опять это слово...)   -  person Adam Smith    schedule 26.11.2017
comment
То, как учитываются значения item1 и item2, определяется вашей функцией сравнения, как указано в ее результатах, поэтому это может быть более или менее все, что может сделать функция - какую часть (части) процесса вы не понимаете?   -  person martineau    schedule 26.11.2017
comment
Вы всегда должны прочитать хотя бы документацию, прежде чем задавать вопросы здесь — это ожидаемо. Также рассмотрите моменты, упомянутые в ответах на вопрос Какие исследовательские усилия ожидаются от пользователей Stack Overflow?   -  person martineau    schedule 26.11.2017
comment
@martineau В первой операции передаются 1 и 2, во второй 3 и 1, в третьей 3 и 2. Мой вопрос в том, как по какому правилу передаются эти значения?   -  person Rajat Raj    schedule 26.11.2017
comment
Для получения таких подробностей вам нужно изучить, как работает гибридный Timsort Python. В Википедии есть статья об этом. Ссылки на статью есть в документации по Python (вот один из них).   -  person martineau    schedule 26.11.2017
comment
Для тех, кто дочитал до этого места, это не упоминается в документации (насколько я знаю), но вы можете использовать functools.cmp_to_key как функцию @decorator из-за того, как она написана, что делает ее использование еще проще.   -  person martineau    schedule 26.11.2017
comment
Точные сравниваемые значения — это детали реализации алгоритма сортировки, которые могут быть изменены и не должны иметь значения для вас. Если вам действительно нужно понять это до такого уровня детализации, вам следует прочитать существующую документацию, как предлагает @martineau. Эти детали выходят за рамки ответа StackOverflow.   -  person Mark Ransom    schedule 26.11.2017