45

鉴于以下列表

['Jellicle', 'Cats', 'are', 'black', 'and', 'white,', 'Jellicle', 'Cats', 
 'are', 'rather', 'small;', 'Jellicle', 'Cats', 'are', 'merry', 'and', 
 'bright,', 'And', 'pleasant', 'to', 'hear', 'when', 'they', 'caterwaul.', 
 'Jellicle', 'Cats', 'have', 'cheerful', 'faces,', 'Jellicle', 'Cats', 
 'have', 'bright', 'black', 'eyes;', 'They', 'like', 'to', 'practise', 
 'their', 'airs', 'and', 'graces', 'And', 'wait', 'for', 'the', 'Jellicle', 
 'Moon', 'to', 'rise.', '']

我正在尝试计算每个单词出现的次数并显示前 3 个。

但是,我只想找到首字母大写的前三个单词,而忽略所有首字母大写的单词。

我确信有比这更好的方法,但我的想法是执行以下操作:

  1. 将列表中的第一个单词放入另一个名为 uniquewords 的列表中
  2. 从原始列表中删除第一个单词及其所有重复项
  3. 将新的第一个单词添加到唯一单词中
  4. 从原始列表中删除第一个单词及其所有重复项。
  5. ETC...
  6. 直到原始列表为空....
  7. 计算 uniquewords 中每个单词在原始列表中出现的次数
  8. 找到前 3 个并打印
4

11 回答 11

85

在 Python 2.7 及更高版本中,有一个名为Counter的类可以帮助您:

from collections import Counter
words_to_count = (word for word in word_list if word[:1].isupper())
c = Counter(words_to_count)
print c.most_common(3)

结果:

[('Jellicle', 6), ('Cats', 5), ('And', 2)]

我对编程很陌生,所以请尝试以最简单的方式进行。

您可以改为使用字典来执行此操作,其中键是单词,值是该单词的计数。如果单词不存在,则首先迭代将它们添加到字典中的单词,或者如果单词存在则增加单词的计数。然后要找到前三个,您可以使用简单的O(n*log(n))排序算法并从结果中获取前三个元素,或者您可以使用一种O(n)算法,扫描列表一次,只记住前三个元素。

对初学者的一个重要观察是,通过使用专为此目的设计的内置类,您可以节省大量工作和/或获得更好的性能。熟悉标准库及其提供的功能是件好事。

于 2010-08-29T11:25:12.443 回答
23

如果您使用的是早期版本的 Python,或者您有充分的理由推出自己的字数计数器(我想听听!),您可以尝试使用以下方法使用dict.

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> word_list = ['Jellicle', 'Cats', 'are', 'black', 'and', 'white,', 'Jellicle', 'Cats', 'are', 'rather', 'small;', 'Jellicle', 'Cats', 'are', 'merry', 'and', 'bright,', 'And', 'pleasant', 'to', 'hear', 'when', 'they', 'caterwaul.', 'Jellicle', 'Cats', 'have', 'cheerful', 'faces,', 'Jellicle', 'Cats', 'have', 'bright', 'black', 'eyes;', 'They', 'like', 'to', 'practise', 'their', 'airs', 'and', 'graces', 'And', 'wait', 'for', 'the', 'Jellicle', 'Moon', 'to', 'rise.', '']
>>> word_counter = {}
>>> for word in word_list:
...     if word in word_counter:
...         word_counter[word] += 1
...     else:
...         word_counter[word] = 1
... 
>>> popular_words = sorted(word_counter, key = word_counter.get, reverse = True)
>>> 
>>> top_3 = popular_words[:3]
>>> 
>>> top_3
['Jellicle', 'Cats', 'and']

重要提示:只要您想使用这样的算法,交互式 Python 解释器就是您的朋友。只需输入它并观察它,一路检查元素。

于 2010-08-29T12:05:50.227 回答
20

只返回一个包含最常用词的列表:

from collections import Counter
words=["i", "love", "you", "i", "you", "a", "are", "you", "you", "fine", "green"]
most_common_words= [word for word, word_count in Counter(words).most_common(3)]
print most_common_words

这打印:

['you', 'i', 'a']

“”中的 3most_common(3)指定要打印的项目数。 Counter(words).most_common()返回一个元组列表,每个元组将单词作为第一个成员,将频率作为第二个成员。元组按单词的频率排序。

`most_common = [item for item in Counter(words).most_common()]
print(str(most_common))
[('you', 4), ('i', 2), ('a', 1), ('are', 1), ('green', 1), ('love',1), ('fine', 1)]`

“the word for word, word_counter in”,只提取元组的第一个成员。

于 2013-09-03T08:19:01.180 回答
12

不就是这样吗……

word_list=['Jellicle', 'Cats', 'are', 'black', 'and', 'white,', 'Jellicle', 'Cats', 
 'are', 'rather', 'small;', 'Jellicle', 'Cats', 'are', 'merry', 'and', 
 'bright,', 'And', 'pleasant', 'to', 'hear', 'when', 'they', 'caterwaul.', 
 'Jellicle', 'Cats', 'have', 'cheerful', 'faces,', 'Jellicle', 'Cats', 
 'have', 'bright', 'black', 'eyes;', 'They', 'like', 'to', 'practise', 
 'their', 'airs', 'and', 'graces', 'And', 'wait', 'for', 'the', 'Jellicle', 
 'Moon', 'to', 'rise.', ''] 

from collections import Counter
c = Counter(word_list)
c.most_common(3)

哪个应该输出

[('Jellicle', 6), ('Cats', 5), ('are', 3)]

于 2017-06-11T07:31:10.227 回答
6

nltk对很多语言处理的东西都很方便。它具有内置的频率分布方法。例如:

import nltk
fdist = nltk.FreqDist(your_list) # creates a frequency distribution from a list
most_common = fdist.max()    # returns a single element
top_three = fdist.keys()[:3] # returns a list
于 2011-01-17T00:38:46.960 回答
6

一个简单的两行解决方案,不需要任何额外的模块是以下代码:

lst = ['Jellicle', 'Cats', 'are', 'black', 'and','white,',
       'Jellicle', 'Cats','are', 'rather', 'small;', 'Jellicle', 
       'Cats', 'are', 'merry', 'and','bright,', 'And', 'pleasant',    
       'to','hear', 'when', 'they', 'caterwaul.','Jellicle', 
       'Cats', 'have','cheerful', 'faces,', 'Jellicle',
       'Cats','have', 'bright', 'black','eyes;', 'They', 'like',
       'to', 'practise','their', 'airs', 'and', 'graces', 'And', 
       'wait', 'for', 'the', 'Jellicle','Moon', 'to', 'rise.', '']

lst_sorted=sorted([ss for ss in set(lst) if len(ss)>0 and ss.istitle()], 
                   key=lst.count, 
                   reverse=True)
print lst_sorted[0:3]

输出:

['Jellicle', 'Cats', 'And']

方括号中的项返回列表中的所有唯一字符串,这些字符串不为空且以大写字母开头。然后该sorted()函数按它们在列表中出现的频率(通过使用lst.count键)以相反的顺序对它们进行排序。

于 2015-09-23T17:57:08.600 回答
5

有两种标准库方法可以在列表中查找最常见的值:

statistics.mode

from statistics import mode
most_common = mode([3, 2, 2, 2, 1, 1])  # 2
most_common = mode([3, 2])  # StatisticsError: no unique mode
  • 如果没有唯一的最频繁值,则引发异常
  • 只返回单个最频繁的值

collections.Counter.most_common

from collections import Counter
most_common, count = Counter([3, 2, 2, 2, 1, 1]).most_common(1)[0]  # 2, 3
(most_common_1, count_1), (most_common_2, count_2) = Counter([3, 2, 2]).most_common(2)  # (2, 2), (3, 1)
  • 可以返回多个最常见的值
  • 也返回元素计数

所以在这个问题的情况下,第二个将是正确的选择。作为旁注,两者在性能方面是相同的。

于 2019-04-06T21:02:00.343 回答
2

这样做的简单方法是(假设您的列表在“l”中):

>>> counter = {}
>>> for i in l: counter[i] = counter.get(i, 0) + 1
>>> sorted([ (freq,word) for word, freq in counter.items() ], reverse=True)[:3]
[(6, 'Jellicle'), (5, 'Cats'), (3, 'to')]

完整样本:

>>> l = ['Jellicle', 'Cats', 'are', 'black', 'and', 'white,', 'Jellicle', 'Cats', 'are', 'rather', 'small;', 'Jellicle', 'Cats', 'are', 'merry', 'and', 'bright,', 'And', 'pleasant', 'to', 'hear', 'when', 'they', 'caterwaul.', 'Jellicle', 'Cats', 'have', 'cheerful', 'faces,', 'Jellicle', 'Cats', 'have', 'bright', 'black', 'eyes;', 'They', 'like', 'to', 'practise', 'their', 'airs', 'and', 'graces', 'And', 'wait', 'for', 'the', 'Jellicle', 'Moon', 'to', 'rise.', '']
>>> counter = {}
>>> for i in l: counter[i] = counter.get(i, 0) + 1
... 
>>> counter
{'and': 3, '': 1, 'merry': 1, 'rise.': 1, 'small;': 1, 'Moon': 1, 'cheerful': 1, 'bright': 1, 'Cats': 5, 'are': 3, 'have': 2, 'bright,': 1, 'for': 1, 'their': 1, 'rather': 1, 'when': 1, 'to': 3, 'airs': 1, 'black': 2, 'They': 1, 'practise': 1, 'caterwaul.': 1, 'pleasant': 1, 'hear': 1, 'they': 1, 'white,': 1, 'wait': 1, 'And': 2, 'like': 1, 'Jellicle': 6, 'eyes;': 1, 'the': 1, 'faces,': 1, 'graces': 1}
>>> sorted([ (freq,word) for word, freq in counter.items() ], reverse=True)[:3]
[(6, 'Jellicle'), (5, 'Cats'), (3, 'to')]

简单我的意思是在几乎每个版本的 python 中工作。

如果您不了解此示例中使用的某些函数,您可以随时在解释器中执行此操作(粘贴上面的代码后):

>>> help(counter.get)
>>> help(sorted)
于 2010-08-29T12:13:00.900 回答
2

@Mark Byers 的答案是最好的,但是如果您使用的是 Python < 2.7 的版本(但至少是 2.5,现在已经很老了),您可以通过 defaultdict 非常简单地复制 Counter 类功能(否则,对于 python < 2.5,在 d[i] +=1 之前需要三行额外的代码,如@Johnnysweb 的回答)。

from collections import defaultdict
class Counter():
    ITEMS = []
    def __init__(self, items):
        d = defaultdict(int)
        for i in items:
            d[i] += 1
        self.ITEMS = sorted(d.iteritems(), reverse=True, key=lambda i: i[1])
    def most_common(self, n):
        return self.ITEMS[:n]

然后,您完全按照 Mark Byers 的答案使用该课程,即:

words_to_count = (word for word in word_list if word[:1].isupper())
c = Counter(words_to_count)
print c.most_common(3)
于 2014-02-13T16:36:35.763 回答
2

我想用 python 中强大的数组计算模块 numpy 来回答这个问题。

这是代码片段:

import numpy
a = ['Jellicle', 'Cats', 'are', 'black', 'and', 'white,', 'Jellicle', 'Cats', 
 'are', 'rather', 'small;', 'Jellicle', 'Cats', 'are', 'merry', 'and', 
 'bright,', 'And', 'pleasant', 'to', 'hear', 'when', 'they', 'caterwaul.', 
 'Jellicle', 'Cats', 'have', 'cheerful', 'faces,', 'Jellicle', 'Cats', 
 'have', 'bright', 'black', 'eyes;', 'They', 'like', 'to', 'practise', 
 'their', 'airs', 'and', 'graces', 'And', 'wait', 'for', 'the', 'Jellicle', 
 'Moon', 'to', 'rise.', '']
dict(zip(*numpy.unique(a, return_counts=True)))

输出

{'': 1, 'And': 2, 'Cats': 5, 'Jellicle': 6, 'Moon': 1, 'They': 1, 'airs': 1, 'and': 3, 'are': 3, 'black': 2, 'bright': 1, 'bright,': 1, 'caterwaul.': 1, 'cheerful': 1, 'eyes;': 1, 'faces,': 1, 'for': 1, 'graces': 1, 'have': 2, 'hear': 1, 'like': 1, 'merry': 1, 'pleasant': 1, 'practise': 1, 'rather': 1, 'rise.': 1, 'small;': 1, 'the': 1, 'their': 1, 'they': 1, 'to': 3, 'wait': 1, 'when': 1, 'white,': 1}

输出在字典对象中,格式为(键,值)对,其中值是特定单词的计数

这个答案是受到stackoverflow上另一个答案的启发,你可以在这里查看

于 2020-05-03T04:35:27.377 回答
1

如果您正在使用Count,或者已经创建了自己的Count风格的字典并想要显示项目的名称和数量,您可以像这样遍历字典:

top_10_words = Counter(my_long_list_of_words)
# Iterate around the dictionary
for word in top_10_words:
        # print the word
        print word[0]
        # print the count
        print word[1]

或在模板中遍历它:

{% for word in top_10_words %}
        <p>Word: {{ word.0 }}</p>
        <p>Count: {{ word.1 }}</p>
{% endfor %}

希望这可以帮助某人

于 2016-12-01T09:25:02.493 回答