Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Это сознательное дизайнерское решение по части Guido (он даже несколько неохотно относился к добавлению модуля collections). Его цель - сохранить "один очевидный способ сделать это", когда дело доходит до выбора типов данных для приложений.

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

Учитывая, что список + сортировка, список + heapq и list + bisect охватывают многие из вариантов использования, которые в противном случае полагались бы на структуру, отсортированную по собственному усмотрению, а также такие пакеты, как blist, нет большого диска, чтобы добавить больше сложностей в это пространство для стандартной библиотеки.

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

Ответ 2

Также существует модуль python sortedcontainers, который реализует сортированные типы списка, dict и set. Он очень похож на blist, но реализован в чистом-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.

Ответ 3

Существует также модуль blist, который содержит sortedset:

sortedset(iterable=(), key=None)

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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