Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are there no sorted containers in Python's standard libraries?

Is there a Python design decision (PEP) that precludes a sorted container from being added to Python?

(OrderedDict is not a sorted container since it is ordered by insertion order.)

like image 408
Neil G Avatar asked May 10 '11 16:05

Neil G


People also ask

Is there a sorted set in Python?

Sorted set is a sorted mutable set in which values are unique and maintained in sorted order. Sorted set uses a set for set-operations and maintains a sorted list of values. Sorted set values must be hashable and comparable.

What is Sortedlist in Python?

Python sorted() FunctionThe sorted() function returns a sorted list of the specified iterable object. You can specify ascending or descending order. Strings are sorted alphabetically, and numbers are sorted numerically. Note: You cannot sort a list that contains BOTH string values AND numeric values.


2 Answers

There's also a python sortedcontainers module that implements sorted list, dict, and set types. It's very similar to blist but implemented in pure-Python and in most cases faster.

>>> from sortedcontainers import SortedSet >>> ss = SortedSet([3, 7, 2, 2]) >>> ss SortedSet([2, 3, 7]) 

It also has functionality uncommon to other packages:

>>> from sortedcontainers import SortedDict >>> sd = SortedDict((num, num) for num in range(100000)) >>> sd.iloc[-5] # Lookup the fifth-to-last key. 99995 

Disclosure: I am the author of the sortedcontainers module.

like image 59
GrantJ Avatar answered Oct 09 '22 11:10

GrantJ


It's a conscious design decision on Guido's part (he was even somewhat reluctant regarding the addition of the collections module). His goal is to preserve "one obvious way to do it" when it comes to the selection of data types for applications.

The basic concept is that if a user is sophisticated enough to realise that the builtin types aren't the right solution for their problem, then they're also up to the task of finding an appropriate third party library.

Given that list+sorting, list+heapq and list+bisect cover many of the use cases that would otherwise rely on inherently sorted data structures, and packages like blist exist, there isn't a huge drive to add more complexity in this space to the standard library.

In some ways, it is similar to the fact that there's no multi-dimensional array in the standard library, instead ceding that task to the NumPy folks.

like image 44
ncoghlan Avatar answered Oct 09 '22 09:10

ncoghlan