Począwszy od Python 3.6, dict
typ standardowy domyślnie zachowuje porządek wstawiania.
Definiowanie
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
spowoduje utworzenie słownika z kluczami w kolejności podanej w kodzie źródłowym.
Osiągnięto to poprzez użycie prostej tablicy z liczbami całkowitymi dla rzadkiej tablicy mieszającej, gdzie te liczby całkowite indeksują do innej tablicy, która przechowuje pary klucz-wartość (plus obliczony skrót). Ta ostatnia tablica po prostu przechowuje elementy w kolejności wstawiania, a cała kombinacja faktycznie zużywa mniej pamięci niż implementacja używana w Pythonie 3.5 i wcześniejszych. Szczegółowe informacje można znaleźć w oryginalnym wpisie pomysłu autorstwa Raymonda Hettingera .
W wersji 3.6 nadal uważano to za szczegół implementacji; zobacz dokumentację Co nowego w dokumentacji Python 3.6 :
Aspekt zachowywania porządku w tej nowej implementacji jest uważany za szczegół implementacji i nie należy na nim polegać (może się to zmienić w przyszłości, ale pożądane jest, aby ta nowa implementacja dyktowania w języku była dostępna przez kilka wydań przed zmianą specyfikacji języka narzucenie semantyki zachowującej porządek dla wszystkich bieżących i przyszłych implementacji Pythona; pomaga to również zachować zgodność wsteczną ze starszymi wersjami języka, w którym wciąż obowiązuje kolejność losowych iteracji, np. Python 3.5).
Python 3.7 podnosi ten szczegół implementacji do specyfikacji języka , więc jest teraz obowiązkowy, aby dict
zachować porządek we wszystkich implementacjach Python kompatybilnych z tą wersją lub nowszą. Zobacz oświadczenie BDFL .
W niektórych przypadkach nadal możesz chcieć użyć tej collections.OrderedDict()
klasy , ponieważ oferuje ona dodatkowe funkcje oprócz standardowego dict
typu. Takich jak istnienie odwracalność (dotyczy to także obiektów widoku ) i obsługa zmiany kolejności ( move_to_end()
metodą ).
dict()
Dokumentacja zawiera jeszcze jeden przykład.zawiera
Jeśli wartości to
True
(lub jakikolwiek inny niezmienny obiekt), możesz również użyć:źródło
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
będą działać, gdy wspomniane podejście:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
utrzyma porządek.Zamiast wyjaśniać część teoretyczną podam prosty przykład.
źródło
OrderedDict
rzeczywiście rozwiązuje problem, ale ... w tym konkretnym przykładzie uzyskuje się dokładnie ten sam wynik przy użyciu standardowego słownika{'aol': 1, 'foo': 3}
więc myślę, że to dobry przykład ilustrujący.OrderedDict.update()
z iterable zawierających par klucz-wartość:d1.upate([(key1, val1), (key2, val2)])
.Zauważ, że ta odpowiedź dotyczy wersji Pythona wcześniejszych niż Python3.7. CPython 3.6 utrzymuje porządek wstawiania w większości przypadków jako szczegół implementacji. Począwszy od wersji Python 3.7, zadeklarowano, że implementacje MUSZĄ zachować kolejność wstawiania, aby była zgodna.
słowniki python są nieuporządkowane. Jeśli chcesz uporządkowanego słownika, wypróbuj kolekcje .
Zwróć uwagę, że w standardowej bibliotece Python 2.7 wprowadzono OrdersDict. Jeśli masz starszą wersję Pythona, możesz znaleźć przepisy na uporządkowane słowniki na ActiveState .
źródło
Słowniki używają kolejności, która sprawia, że wyszukiwanie jest wydajne, a ty nie możesz tego zmienić,
Możesz po prostu użyć listy obiektów (krotka 2-elementowa w prostym przypadku, a nawet klasy) i dołączyć elementy na końcu. Następnie możesz użyć wyszukiwania liniowego, aby znaleźć w nim elementy.
Alternatywnie możesz utworzyć lub użyć innej struktury danych utworzonej z zamiarem utrzymania porządku.
źródło
Natknąłem się na ten post, próbując dowiedzieć się, jak nakłonić OrDERDict do pracy. PyDev dla Eclipse w ogóle nie mógł znaleźć OrdersDict, więc ostatecznie zdecydowałem się stworzyć krotkę kluczowych wartości ze słownika, tak jak chciałbym, aby były uporządkowane. Kiedy musiałem wypisać moją listę, właśnie wykonałem iterację wartości krotki i podłączyłem iterowany „klucz” z krotki do słownika, aby pobrać moje wartości w kolejności, w jakiej ich potrzebowałem.
przykład:
Jest to trochę uciążliwe, ale mam presję czasu i jest to obejście.
Uwaga: podejście do listy list sugerowane przez kogoś innego nie ma dla mnie sensu, ponieważ listy są uporządkowane i indeksowane (a także mają inną strukturę niż słowniki).
źródło
Za pomocą słownika nie można naprawdę robić tego, co chcesz. Słownik został już
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
utworzony. Odkryłem, że nie ma sposobu, aby utrzymać porządek, gdy jest już utworzony. Zamiast tego utworzyłem plik json z obiektem:Użyłem:
następnie użyty:
do weryfikacji.
źródło
źródło
Inną alternatywą jest użycie Pand,
dataframe
ponieważ gwarantuje to porządek i lokalizację indeksów przedmiotów w strukturze przypominającej dict.źródło
Generalnie, można zaprojektować klasy, która zachowuje się jak słownik, będzie głównie realizacji metody
__contains__
,__getitem__
,__delitem__
,__setitem__
i trochę więcej. Ta klasa może mieć dowolne zachowanie, na przykład uprzywilejowanie posortowanego iteratora nad klawiszami ...źródło
jeśli chcesz mieć słownik w określonej kolejności, możesz również utworzyć listę list, w której pierwszy element będzie kluczem, a drugi element będzie wartością i będzie wyglądał tak jak w tym przykładzie
źródło
Miałem podobny problem podczas opracowywania projektu Django. Nie mogłem użyć OrdersDict, ponieważ miałem starą wersję Pythona, więc rozwiązaniem było użycie klasy SortedDict Django:
https://code.djangoproject.com/wiki/SortedDict
na przykład,
Uwaga: Ta odpowiedź pochodzi z 2011 roku. Jeśli masz dostęp do Pythona w wersji 2.7 lub nowszej, powinieneś mieć dostęp do standardu teraz
collections.OrderedDict
, którego wiele przykładów zostało podanych przez innych w tym wątku.źródło
Możesz zrobić to samo, co ja dla słownika.
Utwórz listę i opróżnij słownik:
źródło