Разница между sort () и sorted () в python [duplicate]

Counter = 0
for word in stats.keys():
    if stats[word]> counter:
        Counter = stats [word]
print Counter
102
задан smci 26 April 2018 в 00:47
поделиться

4 ответа

sorted() возвращает новый отсортированный список, оставляя исходный список незатронутым. list.sort() сортирует список на месте, мутирует индексы списка и возвращает None (как и все операции на месте).

sorted() работает на любых итеративных, а не только на списках. Строки, кортежи, словари (вы получите ключи), генераторы и т. Д., Возвращая список, содержащий все элементы, отсортированные.

  • Используйте list.sort(), если вы хотите изменить список, sorted(), когда вы хотите вернуть новый отсортированный объект. Используйте sorted(), если вы хотите отсортировать что-то, что является итерируемым, а не список еще .
  • Для списков list.sort() быстрее, чем sorted(), потому что он не " t создать копию. Для любого другого итерабельного выбора у вас нет выбора.
  • Нет, вы не можете получить исходные позиции. После того, как вы вызвали list.sort(), первоначальный порядок исчез.
173
ответ дан Martijn Pieters 17 August 2018 в 09:33
поделиться
  • 1
    В общем случае, когда функция python возвращает None, это знак, что операции выполняются на месте, поэтому, когда вы хотите распечатать list.sort(), он возвращает None. – user1767754 19 November 2017 в 10:34

В чем разница между sorted(list) vs list.sort()?

  • list.sort изменяет список на месте & amp; return None
  • sorted принимает любой итеративный & amp; возвращает новый список, отсортированный.

sorted эквивалентен этой реализации Python, но встроенная функция CPython должна работать заметно быстрее, поскольку она написана на C:

def sorted(iterable, key=None):
    new_list = list(iterable)    # make a new list
    new_list.sort(key=key)       # sort it
    return new_list              # return it

, когда использовать какой?

  • Используйте list.sort, если вы не хотите сохранять исходный порядок сортировки (таким образом, вы сможете повторно использовать список на месте в памяти.), и когда вы являетесь единственным владельцем списка (если список используется другим кодом и вы его мутируете, вы можете ввести ошибки, в которых используется этот список.)
  • Используйте sorted, если вы хотите сохранить исходный порядок сортировки или когда вы хотите создать новый список, которому принадлежит только ваш локальный код.

Можно восстановить исходные позиции списка после list.sort ()?

Нет - если вы сами не сделали копию, эта информация теряется, потому что сортировка выполняется на месте.

«И что быстрее? И сколько быстрее?»

Чтобы проиллюстрировать pena lty создания нового списка, используйте модуль timeit, вот наша настройка:

import timeit
setup = """
import random
lists = [list(range(10000)) for _ in range(1000)]  # list of lists
for l in lists:
    random.shuffle(l) # shuffle each list
shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time
"""

И вот наши результаты для списка случайно упорядоченных 10000 целых чисел, как мы видим здесь, мы опровергли более ранний микс о создании списка :

Python 2.7

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[3.75168503401801, 3.7473005310166627, 3.753129180986434]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[3.702025591977872, 3.709248117986135, 3.71071034099441]

Python 3

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[2.797430992126465, 2.796825885772705, 2.7744789123535156]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[2.675589084625244, 2.8019039630889893, 2.849375009536743]

После некоторой обратной связи , Я решил, что еще один тест будет желателен с разными характеристиками. Здесь я предоставляю тот же случайный упорядоченный список из 100 000 в длину для каждой итерации 1000 раз.

import timeit
setup = """
import random
random.seed(0)
lst = list(range(100000))
random.shuffle(lst)
"""

Я интерпретирую эту большую разницу в размере, полученной от копирования, упомянутого Martijn, но он не доминирует в точке в более старом более популярном ответе здесь, здесь увеличение времени составляет лишь около 10%

>>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000)
[572.919036605, 573.1384446719999, 568.5923951]
>>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000)
[647.0584738299999, 653.4040515829997, 657.9457361929999]

. Я также использовал вышеописанное гораздо меньшую сортировку и увидел, что новая версия sorted все еще занимает около 2% более продолжительного времени работы на определенной длине 1000.

Poke также запускал свой собственный код, вот код:

setup = '''
import random
random.seed(12122353453462456)
lst = list(range({length}))
random.shuffle(lst)
lists = [lst[:] for _ in range({repeats})]
it = iter(lists)
'''
t1 = 'l = next(it); l.sort()'
t2 = 'l = next(it); sorted(l)'
length = 10 ** 7
repeats = 10 ** 2
print(length, repeats)
for t in t1, t2:
    print(t)
    print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats))

Он нашел для сортировки по длине 1000000 , (побежал 100 раз), аналогичный результат, но только примерно на 5% увеличение времени, вот результат:

10000000 100
l = next(it); l.sort()
610.5015971539542
l = next(it); sorted(l)
646.7786222379655

Заключение:

Сортировка большого размера с помощью sorted создание копии, вероятно, будет доминировать над различиями, но сама сортировка доминирует над операцией, и организация кода вокруг этих различий будет преждевременной оптимизацией. Я бы использовал sorted, когда мне нужен новый отсортированный список данных, и я бы использовал list.sort, когда мне нужно было отсортировать список на месте, и пусть это определит мое использование.

24
ответ дан Aaron Hall 17 August 2018 в 09:33
поделиться
  • 1
    Настройка генератора хорошая, но я бы не сделал вывод, что вы слишком быстро разорили миф. Факт остается фактом: sorted() должен выделить новый объект списка и скопировать ссылки; остальные коды кода идентичны. Посмотрите, можете ли вы запускать те же тесты с большими списками. Сравните это с созданием копий списков и посмотрите, сможете ли вы воспроизвести найденные вами различия и т. Д. – Martijn Pieters♦ 17 March 2014 в 02:25

Основное отличие состоит в том, что sorted(some_list) возвращает новый list:

a = [3, 2, 1]
print sorted(a) # new list
print a         # is not modified

и some_list.sort(), сортирует список на месте :

a = [3, 2, 1]
print a.sort() # in place
print a         # it's modified

Обратите внимание, что поскольку a.sort() ничего не возвращает, print a.sort() будет печатать None.


Можно ли восстановить исходные позиции списка после list.sort () ?

Нет, поскольку он изменяет исходный список.

6
ответ дан Christian 17 August 2018 в 09:33
поделиться

Функция .sort () сохраняет значение нового списка непосредственно в переменной списка; так что ответ на третий вопрос будет НЕТ. Также, если вы это сделаете с помощью отсортированного (списка), вы можете использовать его, потому что он не сохраняется в переменной списка. Также иногда метод .sort () действует как функция или говорит, что он принимает в нем аргументы.

Вы должны сохранить значение отсортированного (списка) в переменной явно.

Также для короткой обработки данных скорость не будет иметь разницы; но для длинных списков; вам следует использовать метод .sort () для быстрой работы; но снова вы столкнетесь с необратимыми действиями.

1
ответ дан Vicrobot 17 August 2018 в 09:33
поделиться
  • 1
    & quot; Функция .sort () сохраняет значение нового списка непосредственно в переменной списка & quot; А? Какой новый список? Нет нового списка. Метод list.sort() сортирует объект списка на месте. – PM 2Ring 26 April 2018 в 01:55
  • 2
    Кроме того, что это значит? "иногда метод .sort () действует как функция или говорит, что в нем принимают аргументы. & quot; – PM 2Ring 26 April 2018 в 01:58
  • 3
    То, что я подразумеваю под новым списком, - это измененный список, а .sort () просто сохраняет этот измененный список в эту же переменную. – Vicrobot 26 April 2018 в 02:36
  • 4
    Да, абсолютно иногда метод .sort() принимает аргумент и действует как функция. Также мы называем его методом, потому что это атрибут типа данных списка. – Vicrobot 26 April 2018 в 02:37
  • 5
    Также, что бы вы ни говорили, вы могли бы сказать это в хорошей манере. В чем смысл ха? – Vicrobot 26 April 2018 в 02:38
Другие вопросы по тегам:

Похожие вопросы: