如何找到列表中最常见的元素?

时间:2010-08-29 11:21:21

标签: python list frequency

给出以下列表

['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. 删除第一个单词及其原始列表中的所有单词。
  6. 等...
  7. 直到原始列表为空....
  8. 计算唯一字中每个字出现在原始列表中的次数
  9. 找到前三名并打印

11 个答案:

答案 0 :(得分:62)

在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)算法扫描列表一次只记住前三个元件。

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

答案 1 :(得分:16)

如果您使用的是早期版本的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解释器就是您的朋友。只需输入并观察它,沿途检查元素。

答案 2 :(得分:14)

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

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

most_common(3)”中的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)]`

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

答案 3 :(得分:7)

不就是这个......

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

答案 4 :(得分:5)

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

答案 5 :(得分:2)

一个简单的双线解决方案,不需要任何额外的模块,如下代码:

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键)按相反的顺序对它们进行排序。

答案 6 :(得分:1)

执行此操作的简单方法(假设您的列表位于'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)

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

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(2)  # 2, 3
(most_common_1, count_1), (most_common_2, count_2) = Counter([3, 2, 2]).most_common(2)  # (2, 2), (3, 1)
  • 可以返回多个最频繁的值
  • 还返回元素计数

因此,对于问题,第二个是正确的选择。附带说明一下,两者在性能上是相同的。

答案 9 :(得分:1)

我想用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}

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

这个答案是由另一个关于stackoverflow的答案启发的,您可以here查看它

答案 10 :(得分:0)

如果您正在使用 Count ,或已创建自己的 Count 式dict,并希望显示该项目的名称及其计数,则可以进行迭代在字典周围像这样:

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 %}

希望这有助于某人