web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de conteneurs triés dans les bibliothèques standard de Python?

Existe-t-il une Python décision de conception (PEP) qui empêche l'ajout d'un conteneur trié à Python?

(OrderedDict n'est pas un conteneur trié car il est trié par ordre d'insertion.)

68
Neil G

C'est une décision de conception consciente de la part de Guido (il était même quelque peu réticent concernant l'ajout du module collections). Son objectif est de préserver "une façon évidente de le faire" en ce qui concerne la sélection des types de données pour les applications.

Le concept de base est que si un utilisateur est suffisamment sophistiqué pour se rendre compte que les types intégrés ne sont pas la bonne solution à son problème, il doit également trouver une bibliothèque tierce appropriée.

Étant donné que list + sorting, list + heapq et list + bissect couvrent la plupart des cas d'utilisation qui s'appuieraient autrement sur des structures de données intrinsèquement triées, et que des packages comme blist existent, il n'y a pas un énorme effort pour ajouter plus de complexité dans cet espace à la bibliothèque standard.

À certains égards, cela est similaire au fait qu'il n'y a pas de tableau multidimensionnel dans la bibliothèque standard, cédant plutôt cette tâche aux gens de NumPy.

63
ncoghlan

Il existe également un module python sortedcontainers qui implémente les types de liste, dict et set triés. Il est très similaire à blist mais implémenté dans pure-Python et dans la plupart des cas plus rapide .

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

Il a également des fonctionnalités peu communes aux autres packages:

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

Avis de non-responsabilité: Je suis l'auteur du module sortedcontainers.

67
GrantJ

Il existe également le module blist qui contient un type de données sortedset :

sortedset(iterable=(), key=None)

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

Pas exactement un "conteneur trié", mais vous pourriez être intéressé par le module bisect de la bibliothèque standard, qui "fournit un support pour maintenir une liste dans un ordre trié sans avoir à trier la liste après chaque insertion".

4
Steven

Il y a un heapq dans la bibliothèque standard, il n'est pas exactement trié, mais en quelque sorte. Il y a aussi un paquet blist , mais il n'est pas dans la bibliothèque standard.

1
abbot