【问题标题】:Sort dictionary by the INT value of the value按值的 INT 值对字典进行排序
【发布时间】:2014-02-10 01:44:31
【问题描述】:

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

【问题讨论】:

  • 存储的值是什么? strint?
  • @squiguy 刚试了,没解决问题
  • 是的,因为它们现在按其字符串值按字典顺​​序排序。
  • @Juicy 是的。或key=lambda x: int(x[1])

标签: python sorting dictionary


【解决方案1】:

您必须在键表达式中将值转换为整数。使用

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

尝试key=int(itemgetter(1)) 之类的方法可能很诱人,但这不起作用,因为关键参数需要一个函数。

【讨论】:

  • 第一个版本不行。第二个很好,我才发现和我的答案一样
  • 这与 python3 不兼容 - 更新它会很好。只需将 itemitems() 替换为 items()
【解决方案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 似乎更适合您的应用程序。

【讨论】:

    【解决方案3】:

    对于这种事情,我倾向于做类似的事情

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

    以上假设words 中的值确实是数字。如果不是这种情况,那么我会这样做

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

    (在最后一个表达式中使用float 而不是int 的原因只是一般性:即使您的值开始包含浮点数,代码也保持不变。)

    【讨论】:

      【解决方案4】:

      python3:

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

      【讨论】:

        猜你喜欢
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-13
        • 2011-02-22
        相关资源
        最近更新 更多