95 votes

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

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

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

1 votes

Comme collections.OrderedDict ?

1 votes

C'est simplement plus rapide. O(1) pour hashmap contre O(log n) pour ensemble ordonné.

21 votes

@utdmr : OrderedDict est trié par ordre d'insertion - pas par une clé arbitraire, comme un conteneur trié.

96voto

GrantJ Points 888

Il y a aussi un python conteneurs triés qui implémente les types liste triée, dict, et set. Il est très similaire à blist mais implémenté en 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 possède également des fonctionnalités peu communes à d'autres paquets :

>>> 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.

89voto

ncoghlan Points 10779

Il s'agit d'une décision de conception consciente de la part de Guido (il était même quelque peu réticent quant à l'ajout du collections ). Son objectif est de préserver "une façon évidente de faire" lorsqu'il s'agit de sélectionner des types de données pour les applications.

Le concept de base est le suivant : 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 est également capable de trouver une bibliothèque tierce appropriée.

Étant donné que list+sorting, list+heapq et list+bisect couvrent un grand nombre de cas d'utilisation qui, autrement, s'appuieraient sur des structures de données triées de manière inhérente, et que des paquets comme blist existent, il n'y a pas une grande envie d'ajouter plus de complexité dans cet espace à la bibliothèque standard.

D'une certaine manière, cela ressemble au fait qu'il n'y a pas de tableau multidimensionnel dans la bibliothèque standard, cette tâche étant confiée aux gens de NumPy.

12voto

Adrian Points 419

Il y a aussi le poil à gratter qui contient un ensemble trié type de données :

sortedset(iterable=(), key=None)

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

6voto

Steven Points 10243

Il ne s'agit pas exactement d'un "conteneur trié", mais vous pourriez être intéressé par l'outil de bibliothèque standard bissecter qui "fournit un support pour maintenir une liste dans un ordre trié sans avoir à trier la liste après chaque insertion".

3voto

abbot Points 8093

Hay un heapq dans la bibliothèque standard, il n'est pas exactement trié, mais en quelque sorte. Il existe également un poil à gratter mais il ne fait pas partie de la bibliothèque standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X