Форум сайта python.su
Разработать функцию find_most_frequent(text), которая принимает 1 аргумент – текст произвольной длины, который может содержать буквы латинского алфавита, пробили и знаки препинаний (,.:;!?-); но возвращает список слов (в нижнем регистре), которые встречаются в тексте чаще всего.
Слова, записанные через дефис, считать в двух словах (например, “hand-made”). Слова в разных падежах, числах и с другими превращениями (например, “page” и “pages”) считаются разными словами. Регистр слов – напротив, не суть важно: слова “page” и “Page” считаются 1 словом.
Если слов, которые встречаются чаще всего, несколько – вывести их в алфавитном порядке.
Например Вызов функции: find_most_frequent('Hello,Hello, my dear!')
Возвращает:
Вызов функции: find_most_frequent('to understand recursion you need first to understand recursion…')
Возвращает:
Вызов функции: find_most_frequent('Mom! Mom! Are you sleeping?!!!')
Возвращает:
Офлайн
Офлайн
def find_most_frequent(text, sep='.,:;!?- '): a = {} s = '' for i in text.lower() + '.': if i not in sep: s += i elif s: a[s] = a.setdefault(s,0) + 1 s = '' if not a: return False m = max(a.values()) return sorted([i for i in a if a[i] == m])
Отредактировано terabayt (Март 11, 2015 23:47:26)
Офлайн
from collections import Counter import re def find_most_frequent(text): text = text.lower() words = re.split(r'[;,\s]\s*', text) count = Counter(words) return sorted([w for w, n in count.most_common()])
Отредактировано sander (Март 12, 2015 09:38:20)
Офлайн
terabaytПрокомментируй код пожалуйста
Офлайн
def find_most_frequent(text, sep='.,:;!?- '): # функция которая принимает текст и строку с разделительными знаками a = {} # создаем пустой словарь s = '' # создаем пустую строку for i in text.lower() + '.': # перебор текста в нижнем регистре плюс любой разделительный символ, можно заменить на # for i in text.lower() + sep[0]: if i not in sep: # если символ резделительный s += i # записываем во временную строку этот символ elif s: # иначе если временная строка не пустая a[s] = a.setdefault(s,0) + 1 # если это слово есть в словаре инкрементируем значение, если нету - создаем новый ключ с значением 1 s = '' # обнуляем строку if not a: # если слварь пуст return False # возвращаем False m = max(a.values()) # в переменную m записываем максимальное значение значений словаря return sorted([i for i in a if a[i] == m]) # возвращаем отсортированый список (по алфавиту) всех ключей слваря значение которых равно m (макимальному значению)
>>> from collections import Counter >>> import re >>> def find_most_frequent(text): ... text = text.lower() ... words = re.split(r'[;,\s]\s*', text) ... count = Counter(words) ... return sorted([w for w, n in count.most_common()]) ... >>> print find_most_frequent('la ,.,, la') ['', '.', 'la']
Офлайн
terabayt
from collections import Counter import re def find_most_frequent(text): text = text.lower() words = re.findall(r'[\w]+', text) count = Counter(words) return sorted([w for w, n in count.most_common()])
Отредактировано sander (Март 13, 2015 09:34:55)
Офлайн
sander
>>> from collections import Counter >>> import re >>> def find_most_frequent(text): ... text = text.lower() ... words = re.findall(r'[\w]+', text) ... count = Counter(words) ... return sorted([w for w, n in count.most_common()]) ... >>> print find_most_frequent('a b b c') ['a', 'b', 'c']
Офлайн
terabayt
опять невнимательно прочитал условие
from collections import Counter import re def find_most_frequent(text): text = text.lower() words = re.findall(r'[\w]+', text) count = Counter(words) max_f = count.most_common(1)[0][1] return sorted([w for w, n in count.items() if n == max_f])
Офлайн
sander
осталось только оьбработать ошибки
XrystМОЖЕТ! а эт значит что может и не содержать
который может содержать буквы латинского алфавита, пробили и знаки препинаний (,.:;!?-);
print find_most_frequent('')
Офлайн