2014-02-10 158 views
1

這裏有很多的職位約在Python排序的字典,所以我仔細閱讀,並希望這不是一個重複:排序字典

我使用的字典持有的話作爲鍵和詞的出現作爲價值。這導致了也能像一本字典:

John 1 
Robert 5 
Susie 15 
Alex 6 

我想發生,我用下面的代碼來試圖解決我的字典裏對它們進行排序(在「值」)

John 1 
Robert 5 
Alex 6 
Susie 15 

像這樣:

sorted_words = sorted(words.iteritems(), key=itemgetter(1)) 

但是這將返回元組的排序列表,看起來像這樣:

John 1 
Susie 15 
Robert 5 
Alex 6 

你可以看到問題在於用上面的代碼「按字母順序排列」值,所以15跟在1之後,即使數學上15> 5和6也應該是最後一個。

我怎樣才能修復代碼對待值類型爲int和不是字符串

+0

存儲的值是什麼? 'str'或'int'? – squiguy

+0

@squiguy只是試了一下,它並沒有解決問題 – Juicy

+1

是的,因爲他們現在正按字典順序按字典順序排序。 – squiguy

回答

4

你必須轉換爲數值爲整數你的關鍵表現。使用

sorted_words = sorted(words.iteritems(), key=lambda x: int(x[1])) 

這可能是很有誘惑力的嘗試像key=int(itemgetter(1)),但由於關鍵參數期待的功能,這將無法正常工作。

+0

第一個版本不起作用。第二是罰款,我只是意識到,這是我的回答相同 –

+0

當然.. :)謝謝! –

2

如果你正在尋找由發生排序的話,你真的想使用一個Counter,這基本上是一個預置的直方圖將處理所有這一切給你,甚至讓你調用該函數most_common得到最該字典中的常見元素。

from colletions import Counter 

string = "There there are some some words here here" 
test = Counter(string.split()) 
>>> test.most_common(2) 
[('some', 2), ('here', 2)] 

如果不適合某種原因,您的應用程序,你可以(其它建議),排序你的字典如下:

sorted_words = sorted(words.iteritems(), key=lambda value: float(value[1])) 

Counter似乎是一個更更貼近您的應用程序。

1

對於這樣的事情,我傾向於這樣做

sorted_pairs = sorted(words.iteritems(), key=lambda p: p[1]) 

上述假定,words值確實數字。如果不是的話,那麼我會做

sorted_pairs = sorted(words.iteritems(), key=lambda p: float(p[1])) 

(原因中最後一個表達式使用float代替int僅僅是一般性的:代碼保持不變,即使你的價值觀開始,包括浮點數)