list.sort()
сортирует список и заменяет исходный список, а sorted(list)
возвращает отсортированную копию списка без изменения исходного списка.
- Когда один предпочтительнее другого?
- Что является более эффективным? На сколько?
- Можно ли вернуть список в несортированное состояние после
list.sort()
выполнения?
sorted()
строковый аргумент, но думаете, что это список, вы получаете результат списка, а не строку :sorted("abcd", reverse=True)
дает['d', 'c', 'b', 'a']
не"dcba"
Ответы:
sorted()
возвращает новый отсортированный список, оставляя исходный список без изменений.list.sort()
сортирует список на месте , изменяет индексы списка и возвращаетNone
(как и все операции на месте).sorted()
работает с любыми повторяемыми, а не только списками. Строки, кортежи, словари (вы получите ключи), генераторы и т. Д., Возвращая список, содержащий все отсортированные элементы.Используйте,
list.sort()
если вы хотите изменить список,sorted()
когда вы хотите, чтобы новый отсортированный объект вернулся. Используйте ,sorted()
если вы хотите , чтобы отсортировать то , что является итератор, а не список еще .Для списков
list.sort()
это быстрее, чемsorted()
потому, что не нужно создавать копию. Для любой другой повторяемости у вас нет выбора.Нет, вы не можете восстановить исходные позиции. Как только вы позвонили,
list.sort()
первоначальный заказ исчез.источник
None
, это признак того, что операции выполнены на месте, поэтому, когда вы хотите напечатать,list.sort()
она возвращает None.list.sort
мутирует список на месте и возвращаетNone
sorted
принимает любую итерацию и возвращает новый список, отсортированный.sorted
эквивалентно этой реализации Python, но встроенная функция CPython должна выполняться заметно быстрее, как написано в C:list.sort
если вы не хотите сохранять исходный порядок сортировки (таким образом, вы сможете повторно использовать список на месте в памяти.) И когда вы являетесь единственным владельцем списка (если список используется другим кодом, и вы мутировать его, вы можете вносить ошибки, где этот список используется.)sorted
если вы хотите сохранить исходный порядок сортировки или когда вы хотите создать новый список, которым владеет только ваш локальный код.Нет - если вы не сделали копию самостоятельно, эта информация будет потеряна, потому что сортировка выполняется на месте.
Чтобы проиллюстрировать недостатки создания нового списка, используйте модуль timeit, вот наши настройки:
И вот наши результаты для списка случайным образом расположенных 10000 целых чисел, как мы можем видеть здесь, мы опровергли более старый миф о расходах на создание списка :
Python 2.7
Python 3
После некоторой обратной связи я решил, что желателен другой тест с другими характеристиками. Здесь я предоставляю один и тот же случайно упорядоченный список длиной 100 000 для каждой итерации 1000 раз.
Я интерпретирую разницу этого более крупного сорта от копирования, упомянутого Мартийном, но она не доминирует в той точке, которая указана в более старом, более популярном ответе здесь, здесь увеличение времени составляет всего около 10%.
Я также выполнил вышеупомянутое в намного меньшем виде и увидел, что новая
sorted
версия копии все еще занимает примерно на 2% больше времени работы при длине порядка 1000.Poke также запустил свой собственный код, вот код:
Он нашел для сортировки длины 1000000 (выполненной 100 раз) аналогичный результат, но только с увеличением времени примерно на 5%, вот результат:
Вывод:
Список большого размера, сортируемый с
sorted
созданием копии, вероятно, будет доминировать в различиях, но сама сортировка доминирует в операции, и организация вашего кода вокруг этих различий будет преждевременной оптимизацией. Я бы использовал,sorted
когда мне нужен новый отсортированный список данных, и я бы использовал,list.sort
когда мне нужно отсортировать список на месте, и пусть это определяет мое использование.источник
sorted()
нужно выделить новый объект списка и скопировать ссылки; остальные пути кода идентичны. Посмотрите, сможете ли вы запустить те же тесты с большими списками. Сравните это только с созданием копий списков и посмотрите, сможете ли вы воспроизвести найденные различия и т. Д.Основное отличие в том, что
sorted(some_list)
возвращает новоеlist
:и
some_list.sort()
, сортирует список на месте :Обратите внимание, что, поскольку
a.sort()
ничего не возвращает,print a.sort()
напечатаетNone
.Можно ли получить исходные позиции списка после list.sort ()?
Нет, потому что он изменяет исходный список.
источник
print a.sort()
не буду ничего печатать.None
, я уточню это.Функция .sort () сохраняет значение нового списка непосредственно в переменной списка; поэтому ответ на ваш третий вопрос будет НЕТ. Также, если вы сделаете это с помощью сортировки (список), вы можете использовать его, потому что он не хранится в переменной списка. Также иногда метод .sort () действует как функция или говорит, что принимает в нем аргументы.
Вы должны хранить значение sorted (list) в переменной явно.
Также для короткой обработки данных скорость не будет иметь никакого значения; но для длинных списков; Вы должны напрямую использовать метод .sort () для быстрой работы; но опять вы столкнетесь с необратимыми действиями.
источник
list.sort()
Метод сортирует список объектов на месте..sort()
метод принимает аргумент и действует как функция. Также мы называем это методом, потому что это атрибут типа списка.Вот несколько простых примеров, чтобы увидеть разницу в действии:
Смотрите список номеров здесь:
При звонке
sorted
в этот список,sorted
сделаю копию списка. (То есть ваш первоначальный список останется без изменений.)Посмотрим.
возвращается
Глядя на
nums
сноваМы видим исходный список (без изменений и НЕ отсортированный.).
sorted
не изменил первоначальный списокВзяв тот же
nums
список и применив к немуsort
функцию, изменится фактический список.Посмотрим.
Начнем с нашего
nums
списка, чтобы убедиться, что содержание остается прежним.Теперь оригинальный список чисел изменен, и, глядя на числа, мы видим, что наш исходный список изменился и теперь сортируется.
источник
sort () не возвращает никакого значения.
Метод sort () просто сортирует элементы данного списка в определенном порядке - по возрастанию или по убыванию без возврата какого-либо значения.
Синтаксис метода sort ():
источник