python在列表中 - python查找




如何查找列表中最常见的元素? (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

鉴于以下列表

['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. 找到前三名并打印

这样的简单方法是(假设您的列表位于'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)

不仅仅是这个......

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


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

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


如果您正在使用Count ,或者已创建自己的Count- style 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 %}

希望这有助于某人


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






frequency