2011-05-21 60 views
28

鍵我有一本字典秩序Python字典

{'a': 'first', 'b': 'second'} 

不過,我需要字典以不同的順序:

{'b': 'second', 'a': 'first'} 

什麼是做到這一點的最好方法是什麼?

+0

好吧,我的錯,我會閱讀文檔。我只是把它打印出來,然後按照特定的順序排除。我認爲這與它的寫作方式有關。像php的數組。 – Qiao 2011-05-21 18:19:49

+0

@喬這實際上是一個很好的問題。我喜歡「哦,這很容易回答文件」 - 事實並非如此。這個「微不足道的事實」在大多數地方似乎被認爲是知識。我能找到的最好的(OrderedDict,第8.3章)是「OrderedDict是一個字典,它記住了鍵被首次插入的順序。」 – 2011-05-21 18:22:05

+1

嗯,它是這樣的:「最好把字典看作一個*無序的*鍵值對,並且要求鍵是唯一的(在一個字典中)。」來自[教程中的5.5數據結構](http://docs.python.org/tutorial/datastructures.html#dictionaries)。 – 2011-05-21 18:29:03

回答

40

詞典爲未訂購。所以沒有辦法做到這一點。

如果你有python2.7 +,你可以使用collections.OrderedDict - 在這種情況下,你可以使用.items()檢索項目列表,然後扭轉它,然後從列表逆轉創建新的OrderedDict

>>> od = OrderedDict((('a', 'first'), ('b', 'second'))) 
>>> od 
OrderedDict([('a', 'first'), ('b', 'second')]) 
>>> items = od.items() # list(od.items()) in Python3 
>>> items.reverse() 
>>> OrderedDict(items) 
OrderedDict([('b', 'second'), ('a', 'first')]) 

如果您正在使用較舊的Python版本,您可以從http://code.activestate.com/recipes/576693/

+2

沒錯,你的例子中的兩個字典都是相同的。 – Hyperboreus 2011-05-21 18:14:23

+2

排序和排序是不同的東西。 'OrderedDict'沒有排序,不能手動排序,Python中沒有任何數據結構是有序數據結構(即總是自動排序)。 – 2011-05-21 18:18:24

+0

這就是我的意思。但爲了清晰起見編輯我的答案。 – ThiefMaster 2011-05-21 18:19:38

6

字典沒有順序。

你可以得到鍵,然後按照你喜歡的順序排列它們,然後迭代字典值。

keys = myDict.keys() 
keys = sorted(keys) # order them in some way 
for k in keys: 
    v = myDict[k] 
+0

我想你想要'keys.sort()'。 'sorted()'返回一個新的列表,但不修改傳遞的對象。 – ThiefMaster 2011-05-21 18:17:10

+0

@theif - 你是對的。謝謝。 – eduffy 2011-05-21 18:18:30

4

你不能; dict s是unsortable。如果您需要有序的詞典,請使用OrderedDict