【问题标题】:sort list by frequency-value in python [duplicate]在python中按频率值排序列表[重复]
【发布时间】:2013-05-20 22:05:46
【问题描述】:

我是 python 和编程的新手,对我来说要记住这些东西并不容易。 因为我开始读的书很无聊,所以我开始尝试一些想法。

这是我想做的: 打开文本文件,计算每个值的频率(只是系统名称列表),按频率对列表进行排序,然后返回结果。 在网上搜索了一些代码后,我在这里得到了这个:

file = open('C:\\Temp\\Test2.txt', 'r')
text = file.read()
file.close()


word_list = text.lower().split(None)

word_freq = {}

for word in word_list:

    word_freq[word] = word_freq.get(word, 0) + 1
list = sorted(word_freq.keys())
for word in list:
    print ("%-10s %d" % (word, word_freq[word]))

它有效,但它按列表中的单词/系统名称排序:

pc05010    3
pc05012    1
pc05013    8
pc05014    2

我想要这样:

pc05013    8
pc05010    3
pc05014    2
pc05012    1

现在我正在搜索几个小时的按值排序函数。我敢打赌这很容易,但我什么也没找到。

对于我的初学者来说,这与这一行有关:

list = sorted(word_freq.keys())

我想也许是它:

list = sorted(word_freq.values())

但是没有.... 看到关于这种语言的大量信息,但无法让如此简单的事情发挥作用,这让我感到非常沮丧。

请帮忙:)

非常感谢!

【问题讨论】:

  • 您不应该使用list 作为变量名,因为它是内置list() 函数的名称。这样做称为shadowing builtins
  • 好的,谢谢你的建议 :)

标签: python sorting count


【解决方案1】:

你必须在这里使用word_freq.items()

lis = sorted(word_freq.items(), key = lambda x:x[1], reverse = True)
for word,freq in lis:
    print ("%-10s %d" % (word, freq))

不要使用list 作为变量名。

【讨论】:

    【解决方案2】:

    看看collections.Counter

    >>> wordlist = ['foo', 'bar', 'foo', 'baz']
    >>> import collections
    >>> counter = collections.Counter(wordlist)
    >>> counter.most_common()
    [('foo', 2), ('baz', 1), ('bar', 1)]
    

    【讨论】:

      【解决方案3】:

      使用collections.Counter 帮助计算事物,使用with statement 帮助打开(和关闭)文件。

      import collections
      
      with open('C:\\Temp\\Test2.txt', 'r') as f:
          text = f.read()
      
      word_freq = collections.Counter(text.lower().split())
      for word, freq in word_freq.most_common():
          print ("%-10s %d" % (word, freq))
      

      【讨论】:

      • @BurhanKhalid:感谢您的编辑。
      • 没问题 - 你的回答就是我的回答,所以我只是添加了文档链接。
      • 哇,非常感谢。我现在将尝试通过您添加的链接来了解收藏品:)
      猜你喜欢
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多