#Взять из github-репозитория все файлы с новостями в формате txt: newsfr.txt, newsit.txt, newsafr.txt, newscy.txt. #Написать программу, которая будет выводить топ 10 самых часто встречающихся в новостях слов длиннее 6 символов для каждого файла. #Не забываем про декомпозицию и организацию кода в функции. В решении домашнего задания вам могут помочь: split(), sort() или sorted(). # фукнция чтения файлов (ГОТОВО) def read_files(name): import chardet with open(name, 'rb') as f: data = f.read() result = chardet.detect(data) original_text = data.decode(result['encoding']) return original_text # функция подсчета слов длиннее 6 символов (ГОТОВО) def count_word(original_text): to_list = original_text.split(' ') to_set = set() for i in to_list: # заполняем множество с уникальными словами длиной больше 6 символов if len(i) > 6: to_set.add(i) word_value = {} # ищем слова из множества в списке, считаем количество, формируем словарь типа слово:количество for i in to_set: count = 0 for j in to_list: if i == j: count += 1 word_value[i] = count return word_value # возвращаем словарь {слово:количество} # функция сортировки и вывода ТОП-10 def sort_top(word_value): register = list() l_dict = str(len(word_value)) for i in word_value.items(): l_word = str(i[1]) register.append((len(l_dict)-len(l_word))*'0' + str(i[1]) + ' ' + i[0]) # разворачиваем и добавляем нули перед количеством для сортировка, делаем слияние элементов = '00012 слово' register.sort(reverse = True) top_10_list = list() top_10 = {} count = 1 for j in register: top_10[count] = j.split(' ') # получаем словарь типа {1: (количество, слово)} top_10[count][0] = int(top_10[count][0]) if count == 10: break count += 1 return top_10 # возвращаем отсортированный словарь ТОП-10 {номер: (количеств, слово)} # главная функция: запрашивает имя файла, запускает другие функции (ГОТОВО) def main(): while True: name = input('Введите имя файла: newsfr.txt, newsit.txt, newsafr.txt, newscy.txt. Выход - exit: ') if name == 'newsfr.txt' or name == 'newsit.txt' or name == 'newsafr.txt' or name == 'newscy.txt': print('Идет обработка файла ...') top_10 = sort_top(count_word(read_files(name))) for k in top_10.values(): print (k[0], ': ', k[1]) elif name == 'exit': break else: print('Некорректный ввод, повторите.') main()
- сортировка через list.sort() — по умолчанию так, если нужна обратная сортировка, то list.sort(reverse=True), если по какому-то ключу, то list.sort(key=[ключ]). Если нужно, чтобы функция возвращала значение, то используем sorted вместо sort;
- функция chardet для автоматического определения кодировки и перевода в UTF-8.
Аналог с JSON с доработками предыдущего кода (сортировка словаря по значениям через лямбда-функцию):
#Взять из github-репозитория все файлы с новостями в формате json: newsfr.json, newsit.json, newsafr.json, newscy.json. #Написать программу, которая будет выводить топ 10 самых часто встречающихся в новостях слов длиннее 6 символов для каждого файла. #Не забываем про декомпозицию и организацию кода в функции. В решении домашнего задания вам могут помочь: split(), sort() или sorted(). #{'rss': {'_version': '2.0', # '_xmlns:votpusk': 'https://www.votpusk.ru/news.asp', # 'channel': {'category': 'ВгаШЧЬ - єШЯа', # 'description': 'єШЯа - »ХЭвР вгаШбвШзХбЪШе ЭЮТЮбвХЩ ' # 'ЯЮавРЫР І ѕВїГБє.АГ ', # 'items': [{'_id': '545166', # 'description': 'ІЫРбвШ єШЯаР аРббзШвлТРов ' def read_files(name): 'Функция чтения файлов' import json import chardet with open(name, 'rb') as f: data = f.read() result = chardet.detect(data) data = data.decode(result['encoding']) data = json.loads(data) # внимание! load читает файл, loads читает строку original_text = '' for items in data['rss']['channel']['items']: original_text += ' ' + items['description'] return original_text def count_word(original_text): 'функция подсчета слов длиннее 6 символов' to_list = original_text.split(' ') word_value = {} for word in to_list: if len(word) > 6: if word in word_value: word_value[word] += 1 else: word_value[word] = 1 return word_value # возвращаем словарь {слово:количество} def sort_top(word_value): 'функция сортировки и вывода ТОП-10' l = lambda word_value: word_value[1] sort_list = sorted(word_value.items(), key = l, reverse = True) count = 1 top_10 = {} for word in sort_list: top_10[count] = word count += 1 if count == 10: break return top_10 def main(): 'главная функция: запрашивает имя файла, запускает другие функции' while True: name = input('Введите имя файла: newsfr.json, newsit.json, newsafr.json, newscy.json. Выход - exit: ') if name == 'newsfr.json' or name == 'newsit.json' or name == 'newsafr.json' or name == 'newscy.json': print('Идет обработка файла ...') top_10 = sort_top(count_word(read_files(name))) for i in top_10.values(): print (i[1], ': ', i[0]) elif name == 'exit': break else: print('Некорректный ввод, повторите.') main()