Почему в стандартных библиотеках Python нет отсортированных контейнеров?


есть ли решение Python design (PEP), которое исключает добавление отсортированного контейнера в Python?

(OrderedDict не является отсортированным контейнером, так как он упорядочен по порядку вставки.)

6 58

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.

есть еще блист модуль, который содержит sortedset тип данных:

sortedset(iterable=(), key=None)

>>> from blist import sortedset
>>> my_set = sortedset([3,7,2,2])
sortedset([2, 3, 7]

не совсем "сортированный контейнер", но вас может заинтересовать стандартная библиотека разделить пополам модуль, который "обеспечивает поддержку для поддержания списка в отсортированном порядке без необходимости сортировать список после каждой вставки".

есть heapq в стандартной библиотеке он точно не отсортирован, но вид. Существует также блист пакет, но он не находится в стандартной библиотеке.

списки Python упорядочены. Если вы их сортируете, они остаются такими. В Python 2.7 an OrderedDict тип был добавлен для поддержания явно упорядоченного словаря.

Python также имеет наборы (коллекция, в которой члены должны быть уникальными), но по определению они неупорядочены. Сортировка набора просто возвращает list.