2013-03-31 2 views
46

Я пытаюсь создать объект OrderedDict, но как только я его создам, чем все элементы смешаны.Python OrderedDict не поддерживает порядок элементов

Это то, что я делаю:

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

элементы не остаются в порядке, я назначу

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

docs.python.org не пример, и я могу» t выяснить, почему порядок становится беспорядочным. Любая помощь приветствуется.

ответ

85

Вашей проблема заключается в том, что вы строите dict дать исходные данные для OrderedDict - это dictне магазина любого заказа, поэтому заказ теряется, прежде чем он попадет в OrderedDict.

Решение строить из упорядоченного типа данных - самый простой являясь list из 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])]) 

Стоит отметить, что именно поэтому OrderedDict использует синтаксис, что делает для него это строковое представление - строка представления должны пытаться быть действительным кодом Python для воспроизведения объекта, где это возможно, и поэтому на выходе используется список кортежей вместо dict.

+12

Также следует отметить, что для определения порядка передачи имени/значений конструктору недостаточно. '>>> from коллекции import OrderedDict' ' >>> OrderedDict (one = 1, two = 2, three = 3, four = 4) ' ' OrderedDict ([('four', 4), ('one ', 1), (' three ', 3), (' two ', 2)]) ' –

+1

@EricSmith Действительно, по той же причине переменные keyword args (' ** kwargs') в Python хранятся в словаре - поэтому, когда это происходит, порядок теряется, как и раньше. Обратите внимание, что [PEP-468] (http://legacy.python.org/dev/peps/pep-0468/) имеет простое решение - используйте 'OrderedDict' для' kwargs', а не функцию, но возможно когда-нибудь. –

+1

@GarethLatty теперь в [python 3.6] (https://docs.python.org/3/whatsnew/3.6.html#pep-468-preserving-keyword-argument-order) они реализовали PEP-468 – Copperfield

Смежные вопросы