2014-02-10 160 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仅仅是一般性的:代码保持不变,即使你的价值观开始,包括浮点数)