Почему в стандартных библиотеках Python нет отсортированных контейнеров?
есть ли решение Python design (PEP), которое исключает добавление отсортированного контейнера в Python?
(OrderedDict
не является отсортированным контейнером, так как он упорядочен по порядку вставки.)
6 ответов:
это сознательное дизайнерское решение со стороны Гвидо (он даже несколько неохотно относился к добавлению
collections
модуль). Его цель-сохранить "один очевидный способ сделать это", когда речь заходит о выборе типов данных для приложений.основная концепция заключается в том, что если пользователь достаточно сложен, чтобы понять, что встроенные типы не являются правильным решением для своей проблемы, то они также решают задачу поиска подходящей третьей стороны библиотека.
учитывая, что list+sorting, list+heapq и list+bisect охватывают многие варианты использования, которые в противном случае зависели бы от изначально отсортированных структур данных, а пакеты, такие как blist, существуют, нет огромного диска, чтобы добавить больше сложности в это пространство в стандартную библиотеку.
в некотором смысле это похоже на то, что в стандартной библиотеке нет многомерного массива, вместо этого уступая эту задачу людям NumPy.
есть еще питон sortedcontainers модуль, который реализует сортированный список, дикт и набор типов. Это очень похоже на blist, но реализовано в pure-Python и в большинстве случаев быстрее.
>>> from sortedcontainers import SortedSet >>> ss = SortedSet([3, 7, 2, 2]) >>> ss SortedSet([2, 3, 7])
Он также имеет функциональность, необычную для других пакетов:
>>> from sortedcontainers import SortedDict >>> sd = SortedDict((num, num) for num in range(100000)) >>> sd.iloc[-5] # Lookup the fifth-to-last key. 99995
отказ от ответственности: я являюсь автором модуля sortedcontainers.
не совсем "сортированный контейнер", но вас может заинтересовать стандартная библиотека разделить пополам модуль, который "обеспечивает поддержку для поддержания списка в отсортированном порядке без необходимости сортировать список после каждой вставки".
есть
heapq
в стандартной библиотеке он точно не отсортирован, но вид. Существует также блист пакет, но он не находится в стандартной библиотеке.
списки Python упорядочены. Если вы их сортируете, они остаются такими. В Python 2.7 an
OrderedDict
тип был добавлен для поддержания явно упорядоченного словаря.Python также имеет наборы (коллекция, в которой члены должны быть уникальными), но по определению они неупорядочены. Сортировка набора просто возвращает
list
.