Counter = 0
for word in stats.keys():
if stats[word]> counter:
Counter = stats [word]
print Counter
sorted()
возвращает новый отсортированный список, оставляя исходный список незатронутым. list.sort()
сортирует список на месте, мутирует индексы списка и возвращает None
(как и все операции на месте).
sorted()
работает на любых итеративных, а не только на списках. Строки, кортежи, словари (вы получите ключи), генераторы и т. Д., Возвращая список, содержащий все элементы, отсортированные.
list.sort()
, если вы хотите изменить список, sorted()
, когда вы хотите вернуть новый отсортированный объект. Используйте sorted()
, если вы хотите отсортировать что-то, что является итерируемым, а не список еще . list.sort()
быстрее, чем sorted()
, потому что он не " t создать копию. Для любого другого итерабельного выбора у вас нет выбора. list.sort()
, первоначальный порядок исчез. В чем разница между
blockquote>sorted(list)
vslist.sort()
?
list.sort
изменяет список на месте & amp; returnNone
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
, когда использовать какой?
blockquote>
- Используйте
list.sort
, если вы не хотите сохранять исходный порядок сортировки (таким образом, вы сможете повторно использовать список на месте в памяти.), и когда вы являетесь единственным владельцем списка (если список используется другим кодом и вы его мутируете, вы можете ввести ошибки, в которых используется этот список.)- Используйте
sorted
, если вы хотите сохранить исходный порядок сортировки или когда вы хотите создать новый список, которому принадлежит только ваш локальный код.Можно восстановить исходные позиции списка после list.sort ()?
blockquote>Нет - если вы сами не сделали копию, эта информация теряется, потому что сортировка выполняется на месте.
«И что быстрее? И сколько быстрее?»
blockquote>Чтобы проиллюстрировать 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
, когда мне нужно было отсортировать список на месте, и пусть это определит мое использование.
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 () ?
Нет, поскольку он изменяет исходный список.
Функция .sort () сохраняет значение нового списка непосредственно в переменной списка; так что ответ на третий вопрос будет НЕТ. Также, если вы это сделаете с помощью отсортированного (списка), вы можете использовать его, потому что он не сохраняется в переменной списка. Также иногда метод .sort () действует как функция или говорит, что он принимает в нем аргументы.
Вы должны сохранить значение отсортированного (списка) в переменной явно.
Также для короткой обработки данных скорость не будет иметь разницы; но для длинных списков; вам следует использовать метод .sort () для быстрой работы; но снова вы столкнетесь с необратимыми действиями.
list.sort()
сортирует объект списка на месте.
– PM 2Ring
26 April 2018 в 01:55
.sort()
принимает аргумент и действует как функция. Также мы называем его методом, потому что это атрибут типа данных списка.
– Vicrobot
26 April 2018 в 02:37
None
, это знак, что операции выполняются на месте, поэтому, когда вы хотите распечататьlist.sort()
, он возвращает None. – user1767754 19 November 2017 в 10:34