2013-03-31 23 views
46

Bir OrderedDict nesnesi oluşturmaya çalışıyorum ancak bunu daha önce hiç yapmam, öğelerin hepsi karışık.Python OrderedDict öğesi siparişi tutmuyor

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

docs.python.org bir örnek var ve can vermez' unsurlar sırayla kalmaz

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

Ben atamak:

Bu

benim yaptığım Siparişin neden karışıklaştığını anlamaya çalışıyorum. Herhangi bir yardım büyük beğeni topluyor.

cevap

85

Senin sorunun OrderedDict için ilk veriler sağlamak üzere bir dict inşa olmasıdır - bu dict mağaza herhangi bir sipariş yok, bu yüzden OrderedDict ulaşmadan önce sipariş kaybolur.

çözüm sıralı bir veri türünden inşa etmek - en kolay olan bir listtuple 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])]) 

O OrderedDict bunun için yapar sözdizimi kullanır bu yüzden dikkati çekiyor dize gösterimi var - dize Temsiller mümkün olduğunda nesneyi çoğaltmak için geçerli bir Python kodu olmaya çalışmalıdır ve bu yüzden çıktı bir tefek yerine bir tupl listesi kullanır.

+12

Ayrıca, notu/değerleri yapıcıya iletmek, siparişi vermek için yeterli değildir. '>>> koleksiyonlardan içe aktarılan OrderedDict ' ' >>> OrderedDict (bir = 1, iki = 2, üç = 3, dört = 4) ' ' OrderedDict ([(' dört ', 4), (' bir ', 1), (' üç ', 3), (' iki ', 2)]) ' –

+1

@EricSmith Aynı sebepten dolayı - Python'daki değişken anahtar kelime arşivi (' ** kwargs') sözlük olarak saklanır. - bu olduğunda, sipariş eskisi gibi kaybolur. [PEP-468] 'in (http://legacy.python.org/dev/peps/pep-0468/) bunun için basit bir çözümü olduğunu unutmayın - henüz bir özellik değil, 'kwargs' için' OrderedDict' kullanın. belki birgün. –

+1

@GarethLatty şu anda [python 3.6] (https://docs.python.org/3/whatsnew/3.6.html#pep-468-preserving-keyword-argument-order) PEP-468'i uyguladılar – Copperfield