按照值的INT值对字典进行排序

6

这里有很多关于在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而不是字符串。

存储的值是什么类型?是 str 还是 int - squiguy
@squiguy 刚刚尝试过了,它没有解决问题。 - Juicy
1
是的,因为它们现在按照它们的字符串值以字典顺序排序。 - squiguy
1
@Juicy 是的。或者 key=lambda x: int(x[1]) - zhangxaochen
4个回答

6
你需要将键表达式中的值转换为整数。使用以下代码:
sorted_words = sorted(words.iteritems(), key=lambda x: int(x[1]))

也许尝试像key=int(itemgetter(1))这样的方法很诱人,但是由于key参数期望一个函数,因此这种方法不起作用。


第一个版本不起作用。第二个版本可以,我刚意识到它和我的答案一样。 - Óscar López
1
这与Python3不兼容 - 最好更新一下。只需将itemitems()替换为items()。 - Roy Iacob

4

python3:

sorted_words=sorted(words.items(),key=lambda item: int(item[1]))

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]))

但是,计数器似乎更适合您的应用程序。


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的原因很简单:即使您的值开始包括浮点数,代码也保持不变。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接