2013-03-31 22 views
46

Próbuję utworzyć obiekt OrderedDict, ale nie będę go tworzyć, niż wszystkie elementy są pomieszane.Python OrderedDict nie zachowuje elementu zamówienia

To co mam zrobić:

from collections import OrderedDict 
od = OrderedDict({(0,0):[2],(0,1):[1,9],(0,2):[1,5,9]}) 

Elementy nie pozostają w kolejności przypisać

od 
OrderedDict([((0, 1), [1, 9]), ((0, 0), [2]), ((0, 2), [1, 5, 9])]) 

docs.python.org nie posiada przykładowe i mogę” t dowiedzieć się, dlaczego zamówienie jest pomieszane. Każda pomoc jest bardzo doceniana.

Odpowiedz

85

Twoim problemem jest to, że są budowy dict dać wstępne dane do OrderedDict - to dictnie sklep dowolnej kolejności, więc kolejność jest stracone, zanim dojdzie do OrderedDict.

Rozwiązaniem jest budować od uporządkowanej typu danych - Najprostszym będące list z tuple s:

>>> from collections import OrderedDict 
>>> od = OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])]) 
>>> od 
OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])]) 

Warto zauważyć, że jest to dlaczego OrderedDict wykorzystuje składnię to robi dla swojego reprezentacja łańcuch - łańcuch reprezentacje powinny próbować być poprawnym kodem Pythona, aby odtworzyć obiekt tam, gdzie to możliwe, i dlatego wynik używa listy krotek zamiast dyktatury.

+12

Warto również zauważyć, że przekazywanie nazw/wartości do konstruktora nie wystarcza do ustawienia kolejności. '>>> z kolekcji import OrderedDict' ' >>> OrderedDict (jeden = 1, dwa = 2, trzy = 3, cztery = 4) ' ' OrderedDict ([("cztery", 4), ('jeden ', 1), (' trzy ', 3), (' dwa ', 2)]) ' –

+1

@EricSmith Rzeczywiście, z tego samego powodu - zmienne słowa kluczowe args (' ** kwargs') w Pythonie są przechowywane jako słownik - więc gdy tak się stanie, kolejność zostanie utracona, jak poprzednio. Zauważ, że [PEP-468] (http://legacy.python.org/dev/peps/pep-0468/) ma proste rozwiązanie - użyj 'OrderedDict' dla' kwargs', jeszcze nie funkcji, ale może kiedyś. –

+1

@GarethLatty teraz w [python 3.6] (https://docs.python.org/3/whatsnew/3.6.html#pep-468-preserving-keyword-argument-order) wdrożyli PEP-468 – Copperfield

Powiązane problemy