Czy istnieje decyzja projektowa w języku Python (PEP), która uniemożliwia dodanie posortowanego kontenera do Pythona?
( OrderedDict
nie jest sortowanym kontenerem, ponieważ jest uporządkowany według kolejności reklamowej).
python
language-design
sortedset
sortedmap
Neil G.
źródło
źródło
Odpowiedzi:
To świadoma decyzja projektowa ze strony Guido (nawet trochę niechętnie odnosił się do dodania
collections
modułu). Jego celem jest zachowanie „jednego oczywistego sposobu”, jeśli chodzi o wybór typów danych dla aplikacji.Podstawowa koncepcja polega na tym, że jeśli użytkownik jest na tyle wyrafinowany, aby zdać sobie sprawę, że wbudowane typy nie są właściwym rozwiązaniem jego problemu, to musi również znaleźć odpowiednią bibliotekę strony trzeciej.
Biorąc pod uwagę, że lista + sortowanie, lista + heapq i lista + połowa obejmują wiele przypadków użycia, które w przeciwnym razie opierałyby się na z natury posortowanych strukturach danych, a pakiety takie jak blist istnieją, nie ma dużego wysiłku, aby dodać więcej złożoności w tej przestrzeni biblioteka standardowa.
Pod pewnymi względami jest to podobne do faktu, że w standardowej bibliotece nie ma wielowymiarowej tablicy, zamiast tego powierza to zadanie ludziom NumPy.
źródło
collections.Counter
może być używany jako posortowany zestaw. Chociaż może to nie być wydajne.collections.Counter
jest nieposortowany i nie nadaje się do reprezentowania posortowanego zestawu.dict
to tabela skrótów.Istnieje również posortowane kontenery w języku Python moduł , który implementuje sortowane listy, dyktowanie i typy zestawów. Jest bardzo podobny do blist, ale zaimplementowany w czystym Pythonie iw większości przypadków szybszy .
>>> from sortedcontainers import SortedSet >>> ss = SortedSet([3, 7, 2, 2]) >>> ss SortedSet([2, 3, 7])
Ma również funkcjonalność niespotykaną w innych pakietach:
>>> from sortedcontainers import SortedDict >>> sd = SortedDict((num, num) for num in range(100000)) >>> sd.iloc[-5] # Lookup the fifth-to-last key. 99995
Zastrzeżenie: Jestem autorem modułu sortcontainers.
źródło
Istnieje również moduł blist , który zawiera sortowany zestaw danych:
sortedset(iterable=(), key=None) >>> from blist import sortedset >>> my_set = sortedset([3,7,2,2]) sortedset([2, 3, 7]
źródło
Nie jest to dokładnie „posortowany kontener”, ale możesz być zainteresowany modułem z połówką biblioteki standardowej , który „zapewnia obsługę utrzymywania listy w porządku posortowanym bez konieczności sortowania listy po każdym wstawieniu”.
źródło
W
heapq
standardowej bibliotece znajduje się znak , nie jest dokładnie posortowany, ale w pewnym sensie. Istnieje również pakiet blist , ale nie ma go w standardowej bibliotece.źródło
Listy Pythona są uporządkowane. Jeśli je posortujesz, zostaną w ten sposób. W Pythonie 2.7 dodano
OrderedDict
typ, aby utrzymać jawnie uporządkowany słownik.Python również ma zestawy (zbiór, w którym elementy muszą być unikalne), ale z definicji są one nieuporządkowane. Sortowanie zestawu zwraca po prostu a
list
.źródło