【问题标题】:Sort a list and get the most frequent words对列表进行排序并获取最常用的单词
【发布时间】:2015-01-26 02:24:00
【问题描述】:

我是 python 新手,正在尝试对列表进行排序并获取 3 个最常用的单词。我已经到这一步了:

from collections import Counter

reader = open("longtext.txt",'r')
data = reader.read()
reader.close()
words = data.split() # Into a list
uniqe = sorted(set(words)) # Remove duplicate words and sort
for word in uniqe:
        print '%s: %s' %(word, words.count(word) ) # words.count counts the words.

这是我的输出,我怎样才能对最常用的词进行排序并只列出第一个、第二个和第三个常用词?:

2: 2
3.: 1
3?: 1
New: 1
Python: 5
Read: 1
and: 1
between: 1
choosing: 1
or: 2
to: 1    

【问题讨论】:

  • 你的方法有一个缺陷:你不必为了得到三个最常用的词而对这个列表进行排序。
  • 为什么要对单词进行排序以及为什么要删除重复项?

标签: python list python-2.7 frequency


【解决方案1】:

你可以使用collections.counter's most_common方法,像这样

from collections import Counter
with open("longtext.txt", "r") as reader:
    c = Counter(line.rstrip() for line in reader)
print c.most_common(3)

引用官方文档中的例子,

>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

如果您想像问题中显示的那样打印它们,您可以简单地迭代最常见的元素并像这样打印它们

for word, count in c.most_common(3):
    print "{}: {}".format(word, count)

注意: Counter 方法优于排序方法,因为 Counter 的运行时间将在 O(N) 中,而排序在最坏情况下需要 O(N * log N) .

【讨论】:

  • 我收到此错误:“NameError: name 'Counter' is not defined”
  • @user3270211 你需要导入Counterfrom collections import Counter
  • 为了挑剔,这应该类似于O(n*log(k)),其中k 是您想要保留的最高元素的数量。不过,这是一个不错的 Pythonic 答案。
【解决方案2】:

除了most_common,这是pythonic方式作为替代方案,您可以使用sorted

>>> d={'2': 2,'3.': 1,'3?': 1,'New': 1,'Python': 5,'Read': 1,'and': 1,'between': 1,'choosing': 1,'or': 2,'to': 1} 
>>> print sorted(d.items(),key=lambda x :x[1])[-3:]

>>> [('2', 2), ('or', 2), ('Python', 5)]

或使用heapq.nlargest。但请注意nlargest() 函数最适合您尝试查找数量相对较少的项目。 :

import heapq
print heapq.nlargest(3, d.items(),key=lambda x :x[1])
[('Python', 5), ('2', 2), ('or', 2)]

【讨论】:

    【解决方案3】:

    另一种方法,更 Pythonic ..!

    这是另一种不使用计数器或计数方法的方法。希望这能带来更多想法。

    #reader = open("longtext.txt",'r')
    #data = reader.read()
    #reader.close()
    data  = 'aa sfds fsd f sd aa dfdsa dfdsa dfdsa sd sd sds ds dsd sdds sds sd sd sd sd sds sd sds'
    words = data.split()
    word_dic = {}
    for word in words:
        try:
            word_dic[word] = word_dic[word]+1
        except KeyError:
            word_dic[word] = 1
    print  sorted([(value, key) for (key,value) in word_dic.items()])[-3:]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多