2013-02-13 197 views
25

我在Python的字典,這些看起來像這樣:迭代通過按鍵Python字典的排序順序

D = {1:'a', 5:'b', 2:'a', 7:'a'} 

鍵的值大多是不相關的。有沒有辦法按數字順序按鍵遍歷字典?鑰匙都是整數。

與其說

for key in D: 
    # code... 

我可以順利通過的順序1,2,5,7字典鍵?感謝您的幫助提前。

此外,我不能使用排序/排序功能。

+1

的可能的複製(HTTP [在Python,我怎麼遍歷在有序字典?]:/ /stackoverflow.com/questions/364519/in-python-how-do-i-iterate-over-a-dictionary-in-sorted-order) – 2016-07-24 22:50:03

回答

32

您可以使用此:

for key in sorted(D.iterkeys()): 
    .. code .. 

在Python 3.x中,使用D.keys()(與Python 2.x中的D.iterkeys()相同)。

+0

有沒有辦法做到這一點,而不使用顯式的排序功能?這是挑戰的一部分,我們必須在不使用排序功能的情況下對所有內容進行排序。對不起,我應該早些提到這一點。 – ben 2013-02-13 21:35:58

+0

謝謝!太棒了。 – ben 2013-02-13 21:39:42

+0

最後一件事。你知道任何其他方式來通過鍵排序嗎?我非常感謝你的幫助。 – ben 2013-02-13 21:51:04

1

你可以使用dict.keys()鍵的列表,然後遍歷列表的排序視圖:

for key in sorted(D.keys()): 
    print key, D[key] 
+0

有沒有辦法做到這一點,而不明確使用排序功能?這是挑戰的一部分,我們必須在不使用排序功能的情況下對所有內容進行排序。對不起,我應該早些提到這一點。 – ben 2013-02-13 21:36:40

+0

@ben。那麼你將不得不編寫自己的排序邏輯。但你爲什麼要重新發明輪子? – 2013-02-13 21:37:56

+0

通常是因爲有人爲他的CS作業使用堆棧溢出。 – 2017-09-26 18:14:22

7

考慮到您不想排序的規定,並且假設鍵都是整數,您可以簡單地找到鍵的最大值和最小值,然後遍歷該範圍並檢查每個鍵是否實際在字典裏。

for key in xrange(min(D), max(D) + 1): 
    if key in D: 
     print D[key] 

這是不是很有效,當然,但它工作,它避免了排序。

+0

這是一個聰明的黑客。但是,如果字典中只有2個鍵,'1'和'1000000'?說啥? – 2013-02-13 21:43:57

+0

是的,排序絕對更好! – kindall 2013-02-13 21:45:09

+2

這仍然給OP確切的他想要的。 – 2013-02-13 21:46:16

6

假設鍵/值插入順序,您可以使用OrderedDict

>>> from collections import OrderedDict 
>>> d = OrderedDict() 
>>> d[1] = 'a' 
>>> d[2] = 'a' 
>>> d[5] = 'b' 
>>> d[7] = 'a' 
>>> d 
OrderedDict([(1, 'a'), (2, 'a'), (5, 'b'), (7, 'a')]) 
>>> d.keys() 
[1, 2, 5, 7] 
+0

如果您不想更改現有字典,只需爲您的有序字典建立一個臨時變量,並將其設置爲來自集合的OrderedDict(D) >>> import a OrderedDict >>> a = {'a':' A','b':'B','c':'C'} >>> OrderedDict(a) returns - > OrderedDict([('a','A'),('b',' B'),('c','C')]) – 2015-06-19 17:52:08