Wygląda na to, że listy zwracane przez keys()
i values()
metody słownika są zawsze mapowaniem 1 na 1 (zakładając, że słownik nie jest zmieniany między wywołaniem 2 metod).
Na przykład:
>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
print d[k[i]] == v[i]
True
True
True
Jeśli nie zmienisz słownika między dzwonieniem keys()
a dzwonieniem values()
, czy błędem jest założenie, że powyższa pętla for zawsze będzie wyświetlać True? Nie mogłem znaleźć żadnej dokumentacji potwierdzającej to.
Odpowiedzi:
Znajdź to:
Na dokumentacji 2.x oraz dokumentacji 3.x .
źródło
Tak, to, co zaobserwowałeś, jest rzeczywiście gwarantowaną właściwością - listy kluczy (), wartości () i pozycje () zwracają się w odpowiedniej kolejności, jeśli dyktando nie zostanie zmienione. iterkeys () i c również iterują w tej samej kolejności, co odpowiednie listy.
źródło
dataframe
oferuje alternatywę, gdzie elementy mogą być aktualizowane lub usuwane, a kolejność i rozmieszczenie indeks elementów w dict-jak struktury pozostają stałe.Tak, jest to gwarantowane w Pythonie 2.x :
źródło
Tak. Począwszy od CPython 3.6, słowniki zwracają elementy w kolejności ich wstawienia .
Zignoruj część, która mówi, że jest to szczegół implementacji. Takie zachowanie jest gwarantowane w CPython 3.6 i jest wymagane we wszystkich innych implementacjach Python, począwszy od Python 3.7 .
źródło
Dobre odniesienia do dokumentów. Oto w jaki sposób możesz zagwarantować zamówienie niezależnie od dokumentacji / realizacji:
źródło
Zgodnie z http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects metody metody key (), values () i items () zwrócą odpowiednie iteratory, których zamówienia korespondować. Jednak nie mogę znaleźć odniesienia do oficjalnej dokumentacji dla Pythona 2.x dla tej samej rzeczy.
O ile mogę powiedzieć, odpowiedź brzmi tak, ale tylko w python 3.0+
źródło
Co do tego jest warte, niektóre ciężko używane kody produkcyjne, które napisałem, oparte są na tym założeniu i nigdy nie miałem z tym problemu. Wiem, że to nie prawda :-)
Jeśli nie chcesz ryzykować, użyłbym iteritems (), jeśli możesz.
źródło
Nie byłem zadowolony z tych odpowiedzi, ponieważ chciałem upewnić się, że eksportowane wartości mają taką samą kolejność, nawet przy użyciu różnych nagrań.
Tutaj z góry określasz kolejność kluczy, zwracane wartości będą zawsze miały tę samą kolejność, nawet jeśli dykt zmieni się lub użyjesz innego dykta.
źródło