Począwszy od Python 3.6 wbudowany słownik zostanie zamówiony
Dobra wiadomość, więc oryginalny przypadek użycia OP dla par mapowania pobranych z bazy danych z unikalnymi identyfikatorami łańcuchów jako kluczami i wartościami liczbowymi jako wartościami do wbudowanego dict Pythona v3.6 +, powinien teraz przestrzegać kolejności wstawiania.
Jeśli powiedz wynikowe wyrażenia z dwóch kolumn z zapytania do bazy danych, takie jak:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
będą przechowywane w dwóch krotkach Pythona, k_seq i v_seq (wyrównane według indeksu numerycznego i oczywiście o tej samej długości), a następnie:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Pozwól na wyjście później jako:
for k, v in ordered_map.items():
print(k, v)
ustępując w tym przypadku (dla nowego wbudowanego słownika Python 3.6+!):
foo 0
bar 1
baz 42
w tym samym porządku według wartości v.
Gdzie w instalacji Pythona 3.5 na moim komputerze daje on obecnie:
bar 1
foo 0
baz 42
Detale:
Jak zaproponował Raymond Hettinger w 2012 r. (Por. Poczta na python-dev z tematem „Bardziej kompaktowe słowniki z szybszą iteracją” ), a teraz (w 2016 r.) Ogłoszony w mailu Victora Stinnera do python-dev z tematem „ Dict Python 3.6 staje się kompaktowy i dostaje wersję prywatną, a słowa kluczowe zostają uporządkowane ”z powodu poprawki / wdrożenia wydania 27350 „ Kompaktowy i uporządkowany dykt ” w Pythonie 3.6 będziemy teraz mogli użyć wbudowanego dykta do utrzymania kolejności wstawiania !!
Mamy nadzieję, że doprowadzi to do wdrożenia cienkiej warstwy OrdersDict jako pierwszego kroku. Jak wskazał @ JimFasarakis-Hilliard, niektórzy zobaczą przypadki użycia dla typu OrdersDict również w przyszłości. Myślę, że cała społeczność Pythona dokładnie sprawdzi, czy to wytrzyma próbę czasu i jakie będą kolejne kroki.
Czas przemyśleć nasze nawyki programistyczne, aby nie przegapić możliwości, jakie daje stabilne porządkowanie:
- Argumenty słów kluczowych i
- (pośrednie) przechowywanie nagrań
Po pierwsze, ponieważ w niektórych przypadkach ułatwia wysyłanie przy wdrażaniu funkcji i metod.
Drugi, ponieważ zachęca do łatwiejszego wykorzystania dict
s jako magazynu pośredniego w rurociągach przetwórczych.
Raymond Hettinger uprzejmie dostarczył dokumentację wyjaśniającą „ The Tech Behind Python 3.6 Dictionaries ” - z prezentacji w San Francisco Python Meetup Group 2016-DEC-08.
I może całkiem sporo stron z pytaniami i odpowiedziami o wysokim przepełnieniu stosu otrzyma warianty tych informacji i wiele wysokiej jakości odpowiedzi będzie wymagać aktualizacji dla każdej wersji.
Zastrzeżenie Emptor (ale także patrz poniżej aktualizacja 2017-12-15):
Jak słusznie zauważa @ajcr: „Aspekt utrzymywania porządku w tej nowej implementacji jest uważany za szczegół implementacji i nie należy na nim polegać”. (z whatsnew36 ) nie wybieranie nitów, ale cytat został nieco pesymistyczny ;-). Kontynuuje jako „(może się to zmienić w przyszłości, ale pożądane jest, aby ta nowa implementacja dict w języku była dostępna przez kilka wydań przed zmianą specyfikacji języka, aby narzucić obowiązującą semantykę zachowującą porządek dla wszystkich bieżących i przyszłych implementacji Pythona; to również pomaga zachować kompatybilność wsteczną ze starszymi wersjami języka, w którym wciąż obowiązuje kolejność losowych iteracji, np. Python 3.5). ”
Tak jak w niektórych ludzkich językach (np. Niemiecki), użycie kształtuje język, a wola została teraz zadeklarowana ... w whatsnew36 .
Aktualizacja 15.12.2017:
W liście do listy python-dev Guido van Rossum oświadczył:
Zrób to tak. „Dict utrzymuje kolejność wstawiania” to orzeczenie. Dzięki!
Tak więc efekt uboczny CPython wersji 3.6 porządkowania wstawiania dyktów staje się teraz częścią specyfikacji języka (a nie tylko szczegółem implementacji). Ten wątek pocztowy zawierał również niektóre wyróżniające się cele projektowe, o collections.OrderedDict
czym przypomniał Raymond Hettinger podczas dyskusji.