2012-10-15 55 views
3

的長度我有一個這樣的對象:的Python:OrderedDictionary排序基於鍵的值

t = {'rand_key_1': ['x'], 'rand_key_2': [13,23], 'rand_key_3': [(1)], 'rk5': [1,100,3,4,3,3]} 

與隨機密鑰(串和/或INT),其都具有一個列表作爲值,具有不同的字典大小。

我想把這個字典變成一個OrderedDict,它的排序取決於字典項目列表的長度。所以訂貨後,我想:

t_ordered = {'rk5': ..., 'rand_key_2': .., 'rand_key_1': .., 'rand_key_3': ..} 

(如果有兩個或多個項目具有相同的價值,他們的順序並不真正重要

我試過,但我沒有。

OrderedDict(sorted(d, key=lambda t: len(t[1]))) 

我沒有經驗,所以原諒我,如果我做的嘗試是超級笨。

我該怎麼辦?

謝謝。

回答

5

你實際上非常接近你傳遞給sorted的排序函數。要注意的是,排序將按順序返回字典的可讀性。因此,如果我們解決您的功能指標與每個鍵的字典:

>>> sorted(t, key=lambda k: len(t[k])) 
['rand_key_3', 'rand_key_1', 'rand_key_2', 'rk5'] 

你也可以指定鍵以相反的順序返回,並直接遍歷這些鍵:

>>> for sorted_key in sorted(t, key=lambda k: len(t[k]), reverse=True): 
...  print sorted_key, t[sorted_key] 

rk5 [1, 100, 3, 4, 3, 3] 
rand_key_2 [13, 23] 
rand_key_3 [1] 
rand_key_1 ['x'] 

通常你止跌不需要創建OrderedDict,因爲您只需使用最新的字典數據遍歷新的排序列表。

+0

謝謝Hardbyte。必須是我閱讀過的最好答案之一。很好的解釋。我想,我真的明白了。非常感謝! – Phil

3

因爲一個有序字典記得它的插入順序,所以你可以這樣做:

OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
+1

我想你想t [1]按鍵值的長度排序;這根據密鑰的長度來分類。 – schodge

5

使用簡單的字典排序,然後再使用OrderedDict()

>>> from collections import OrderedDict as od 
>>> k=sorted(t, key=lambda x:len(t[x]), reverse=True) 
>>> k 
['rk5', 'rand_key_2', 'rand_key_3', 'rand_key_1'] 

>>> od((x, t[x]) for x in k) 
OrderedDict([('rk5', [1, 100, 3, 4, 3, 3]), ('rand_key_2', [13, 23]), ('rand_key_3', [1]), ('rand_key_1', ['x'])]) 
+0

你好Ashwini。感謝您的幫助。這不是我想要的,但是因爲這是不可能的(我的內心渴望的),我會用你的第一個解決方案來使用它,就像一把鑰匙一樣按順序迭代並從字典中打印。 – Phil

1

OrderedDict在Python是一種集合記住項目插入的順序。在這種情況下排序並不意味着排序。

如果你需要的,就是以有序的所有項目,你可以做這樣的事情:

for key, value in sorted(t, key = lambda x: -len(x[0])): 
    # do something with key and value 

但是,你仍然在使用一個未排序的數據結構 - 只是遍歷它的排序順序。這仍然不支持查找第k個元素或dict中元素的後繼或前任操作。