Jaki jest prawidłowy sposób zainicjowania uporządkowanego słownika (OD), aby zachował kolejność danych początkowych?
from collections import OrderedDict
# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1})
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])
# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])
Pytanie:
Czy
OrderedDict
zachowa kolejność listy krotek, krotek krotek lub krotek list lub list list itp. Przekazanych w czasie inicjalizacji (przykład 2 i 3 powyżej)?Jak sprawdzić, czy
OrderedDict
faktycznie utrzymuje zamówienie? Ponieważdict
kolejność a ma nieprzewidywalną kolejność, co się stanie, jeśli moje wektory testowe na szczęście mają tę samą początkową kolejność, co nieprzewidywalna kolejność dyktu? Na przykład, jeśli zamiastd = OrderedDict({'b':2, 'a':1})
pisaćd = OrderedDict({'a':1, 'b':2})
, mogę błędnie stwierdzić, że porządek jest zachowany. W tym przypadku dowiedziałem się, że adict
jest uporządkowane alfabetycznie, ale nie zawsze może to być prawda. Jaki jest niezawodny sposób wykorzystania kontrprzykładu do sprawdzenia, czy struktura danych zachowuje porządek, czy nie, oprócz wielokrotnego wypróbowywania wektorów testowych, aż jeden się zepsuje?
PS Zostawię to tutaj jako odniesienie : "Konstruktor OrderedDict i metoda update () akceptują argumenty słów kluczowych, ale ich kolejność jest tracona, ponieważ semantyka wywołań funkcji Pythona argumenty słów kluczowych pass-in przy użyciu zwykłego słownika nieuporządkowanego"
PPS: Miejmy nadzieję, że w przyszłości OrderedDict również zachowa kolejność kwargów (przykład 1): http://bugs.python.org/issue16991
źródło
OrderDict(b=2, a=1)
jest też właściwy sposób. Zobacz PEP 468 .Odpowiedzi:
OrderedDict zachowa każde zamówienie, do którego ma dostęp. Jedynym sposobem przekazania do niego uporządkowanych danych w celu zainicjowania jest przekazanie listy (lub, bardziej ogólnie, iterowalnej) par klucz-wartość, tak jak w dwóch ostatnich przykładach. Jak mówi dokumentacja, z którą się łączysz, OrderedDict nie ma dostępu do żadnej kolejności, gdy przekazujesz argumenty słów kluczowych lub argumenty dict, ponieważ każda kolejność jest usuwana, zanim konstruktor OrderedDict je zobaczy.
Zwróć uwagę, że użycie list składanych w ostatnim przykładzie niczego nie zmienia. Nie ma różnicy między
OrderedDict([(i,i) for i in l])
iOrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')])
. Zrozumienie listy jest oceniane, tworzy listę i jest przekazywana; OrderedDict nic nie wie o tym, jak został stworzony.źródło
Tak, to zadziała. Z definicji lista jest zawsze uporządkowana tak, jak jest reprezentowana. Odnosi się to również do rozumienia list, generowana lista jest w ten sam sposób, w jaki dane zostały dostarczone (tj. Źródło z listy będzie deterministyczne, pochodzi z
set
lubdict
nie).Przechowujesz listę źródłową 2-krotek w celach informacyjnych i używasz jej jako danych testowych dla przypadków testowych podczas wykonywania testów jednostkowych. Powtarzaj je i upewnij się, że została zachowana kolejność.
źródło
__hash__
. W szczególności ostr
typie.OrderedDict
aby nie musieć narzutu konwersji listy na plikOrderedDict
. Po prostu przeglądam elementy, takie jak lista zamiast słownika.