Я хотел бы отсортировать числовой список по частотам элементов. (Я нашел несколько способов сделать это.)
В ходе исследования я попробовал следующий пример.
Вопрос: Как работает list.sort (key = list.count)? Можно ли использовать list.count () во время list.sort ()?
Я читал, что ключевая функция оценивается для каждого элемента списка перед сортировкой, и эти значения используются для сравнений во время sort.
Кроме того, я где-то читал, что во время sort () список как бы заблокирован. (извините, я не могу найти ссылку сейчас - я прочитал довольно много блогов и руководств по этому топу c за последние несколько часов, включая Python документацию и инструкции по сортировке)
Это пример
### Python 3.7 ###
data = [22, 11, 33, 99, 88, 77, 22, 44, 55, 44, 66, 22]
# sort by value
data.sort()
print(data)
>>> [11, 22, 22, 22, 33, 44, 44, 55, 66, 77, 88, 99]
# sort by frequency, i.e. list.count()
data.sort(key=data.count)
print(data)
>>> [11, 22, 22, 22, 33, 44, 44, 55, 66, 77, 88, 99]
# expected >>> [11, 33, 55, 66, 77, 88, 99, 44, 44, 22, 22, 22]
# but no change, the value-sorted list is printed
# or
data.sort(key=lambda e: data.count(e))
print(data)
>>> [11, 22, 22, 22, 33, 44, 44, 55, 66, 77, 88, 99]
# expected >>> [11, 33, 55, 66, 77, 88, 99, 44, 44, 22, 22, 22]
# but no change, the value-sorted list is printed
примечание: сообщение об ошибке отсутствует.
В качестве дополнения я хотел бы отметить, что следующее работает должным образом:
max(data, key=data.count)
И, конечно же, это также дает ожидаемый результат
print(sorted(data, key=data.count))
>>> [11, 33, 55, 66, 77, 88, 99, 44, 44, 22, 22, 22]
По документации sorted () и sort () должны возвращать тот же результат, не так ли?
Спасибо за ваше понимание!
РЕДАКТИРОВАТЬ:
По документации - как я понял:
sort () принимает ключевую функцию и подает ключевую - функция с отдельными элементами списка
-> вычисленные результаты - это количество вхождений каждого элемента (результаты эквивалентных элементов с одинаковым вычисленным результатом, поскольку их частота в списке одинакова)
: У меня нет опыта для такой глубокой отладки в Python
: сам data.count () возвращает соответствующий список проверенных мной частот
сохраняет / кэширует вычисленные результаты
: это основа его эффективности
использует кешированные результаты вычислений (!) Для определения порядка исходного списка
-> наименее частые элементы находятся в начале списка, а чаще всего у него обратно
!!! этого не происходит ...
сохраняет список в новом порядке на месте
!!! ... ИЛИ этого не происходит.
Кроме того, насколько я понял (хотя и не уверен), где-то во время этого процесса sort () 'блокирует' исходный список от других использование / доступ (и где-то снимает блокировку - в объяснении было что-то о многопоточных приложениях, насколько я помню).
ВАЖНО:
Я не ищу решения или кода чтобы отсортировать список - я был бы признателен за объяснение того, что происходит:
Почему результатом является фактический возвращенный список, а не мои ожидания?
Для сравнения, почему sorted () работает должным образом?