Альтернативный способ (соответствует AppDomain.BaseDirectory):
AppContext.BaseDirectory
Если вы используете более раннюю версию 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 - ваш друг, когда вы хотите поиграть с таким алгоритмом. Просто введите его и наблюдайте за ходом, осматривая элементы по пути.
Простой способ сделать это (если ваш список в '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)
В 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)
, который сканирует список один раз, запоминая только первые три элемента.
Важным наблюдением для начинающих является то, что используя встроенные классы, предназначенные для этой цели, вы можете сэкономить много работы и / или получить лучшую производительность. Хорошо быть знакомым со стандартной библиотекой и функциями, которые она предлагает.
Простое решение, состоящее из двух строк и не требующее дополнительных модулей, представляет собой следующий код:
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
) в обратном порядке.
Разве это не просто ...
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)]
Если вы используете 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 %}
Надеюсь, это кому-нибудь поможет
Чтобы просто вернуть список, содержащий наиболее распространенные слова:
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']
3 в «most_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)]`
«word for word, word_counter in
», извлекает только первый член кортежа.
Ответ @Mark Byers лучше, но если у вас версия Python < 2.7 (но, по крайней мере, 2.5, что довольно давно), вы можете очень просто воспроизвести функциональность класса Counter с помощью defaultdict (в противном случае для 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]
Затем вы используете класс точно так же, как в ответе Марка Байерса, т.е. :
words_to_count = (word for word in word_list if word[:1].isupper())
c = Counter(words_to_count)
print c.most_common(3)
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
Существует два стандартных способа поиска наиболее часто встречающихся значений в списке:
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)
Так что в случае вопроса второй вариант будет правильным. Как примечание стороны, оба идентичны с точки зрения работы.