2010-12-09 96 views
2

我寫它試圖使用值而不是鍵排序字典的代碼更新方法字典的Python

""" This module sorts a dictionary based on the values of the keys""" 

adict={1:1,2:2,5:1,10:2,44:3,67:2} #adict is an input dictionary 
items=adict.items()## converts the dictionary into a list of tuples 

##print items 

list_value_key=[ [d[1],d[0]] for d in items] """Interchanges the position of the 
               key and the values""" 
list_value_key.sort() 
print list_value_key 

key_list=[ list_value_key[i][1] for i in range(0,len(list_value_key))] 

print key_list ## list of keys sorted on the basis of values 

sorted_adict={} 

*for key in key_list: 
    sorted_adict.update({key:adict[key]}) 
    print key,adict[key] 

print sorted_adict* 

所以,當我打印KEY_LIST我得到預期的答案,但對於最後一部分我嘗試更新字典的代碼,順序不是它應該是。以下是獲得的結果。我不知道爲什麼「更新」方法不起作用。任何幫助或指針表示讚賞

結果:

sorted_adict={1: 1, 2: 2, 67: 2, 5: 1, 10: 2, 44: 3} 
+1

嗨 - 請編輯您的問題,選擇它的代碼部分,點擊'1010101'按鈕,將代碼格式化爲代碼。 – bgporter 2010-12-09 12:46:58

回答

3

Python字典,無論你怎麼插入到他們,是無序的。一般來說,這是散列表的本質。

相反,也許你應該保持鍵列表的順序它們的值或排序是這樣的:[ 5, 1, 44, ...]

這樣,您就可以訪問你的字典排序順序在以後的時間。

+2

可能最簡單的方法是在您需要排序時使用關鍵函數進行排序。 `排序(adict。iteritems(),key = lambda x:x [1])` – 2010-12-09 13:15:05

2

不要這樣排序。

import operator 
adict={1:1,2:2,5:1,10:2,44:3,67:2} 
sorted_adict = sorted(adict.iteritems(), key=operator.itemgetter(1)) 
+0

唯一的問題是`sorted_adict`是`list`,而不是字典。 – martineau 2013-05-14 17:12:27

1

要排序的dictionnary,你也可以同時使用:

adict={1:1,2:2,5:1,10:2,44:3,67:2} 
k = adict.keys() 
k.sort(cmp=lambda k1,k2: cmp(adict[k1],adict[k2])) 

順便說一句,這是沒用的,因爲在dict無以複用後一個dictionnary(他們只是映射類型 - 您可以擁有不可比較的不同類型的鍵)。

2

如果您需要保留其順序的字典,則在collections module中有一個名爲OrderedDict的類。您可以使用該頁面上的食譜來對字典進行排序並創建一個保留排序順序的新OrderedDict。 OrderedDict類在Python 2.7或3.1中可用。

1

一個問題是普通字典由於內部實現的方式而無法排序。 Python 2.7和3.1有一個名爲OrderedDict的新類,作爲他的answer中提到的@kindall添加到他們的collections模塊中。雖然它們不能完全排序,但它們確實保留或記住了鍵和相關值添加到它們的順序,而不管它是如何完成的(包括通過update()方法)。 這意味着您可以通過將輸入字典中的所有內容以所需順序添加到OrderedDict輸出字典中來實現所需的功能。

要做到這一點,您創建的代碼在創建所謂的list_value_key列表並對其進行排序的意義上處於正確的軌道上。使用內置的zip()函數,創建該列表的初始未排序版本的方法稍微簡單快捷一些。下面是說明如何做到這一點代碼:

from collections import OrderedDict 

adict = {1:1, 2:2, 5:1, 10:2, 44:3, 67:2} # input dictionary 

# zip together and sort pairs by first item (value) 
value_keys_list = sorted(zip(adict.values(), adict.keys())) 

sorted_adict = OrderedDict() # value sorted output dictionary 
for pair in value_keys_list: 
    sorted_adict[pair[1]] = pair[0] 

print sorted_adict 
# OrderedDict([(1, 1), (5, 1), (2, 2), (10, 2), (67, 2), (44, 3)]) 

以上可以寫成一個相當優雅的一行:

sorted_adict = OrderedDict((pair[1], pair[0]) 
        for pair in sorted(zip(adict.values(), adict.keys())))