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