В некотором файле содержатся детские имена. Каждое имя указано с новой строки. После имени через пробел записано одно целое число - количество названных этим именем детей. Имена в файле перемешаны в случайном порядке.
Напишите программу, которая считает данные из файла и выведет на экран 5 наиболее популярных имен (каждое в отдельной строке). Имя файла подается на вход и заранее не известно. Если указанного файла не существует, необходимо вывести сообщение "Файл не найден".
Пример:
Если в файле находятся следующие строки:
Аня 5
Саша 10
Кирилл 150
Игорь 1
Юля 999
Миша 2
Вы должны вывести имена Юля, Кирилл, Саша, Аня, Миша (в порядке убывания количества, каждое в отдельной строке)
Python
Срочно нужна помощь с кодом
Эффективное решение выглядит примерно так:
Можно упростить реализацию ценой увеличения сложности алгоритма: все имена будут храниться в памяти, и сложность возрастёт до n log n.
from bisect import bisect_left
from functools import reduce
def add_lmt(lst, e):
p = bisect_left(lst, e)
return lst if p >= 5 else lst[:p] + [e] + lst[p:4]
try:
with open(input(), 'r') as f:
top = reduce(add_lmt, ((-int(freq), name) for line in f for name, freq in [line.split()]), [])
print(*(name for _, name in top), sep = '\n')
except FileNotFoundError:
print('Файл не найден')
Здесь мы в каждый момент храним только 5 топовых имён и обрабатываемое имя, т.е. требования по памяти - константные. Проход, естественно, однократный, асимптотика линейная.Можно упростить реализацию ценой увеличения сложности алгоритма: все имена будут храниться в памяти, и сложность возрастёт до n log n.
try:
with open(input(), 'r') as f:
raw = ((int(freq), name) for line in f for name, freq in [line.split()])
top = sorted(raw, reverse = True)[:5]
print(*(name for _, name in top), sep = '\n')
except FileNotFoundError:
print('Файл не найден')
Вот решение вашей задачи на Python:
```python
import os
filename = input("Введите имя файла: ")
if not os.path.exists(filename):
print("Файл не найден")
else:
# Создаем словарь для хранения количества упоминаний каждого имени
name_counts = {}
# Читаем данные из файла и подсчитываем количество упоминаний для каждого имени
with open(filename, 'r') as f:
for line in f:
name, count = line.strip().split()
if name in name_counts:
name_counts[name] += int(count)
else:
name_counts[name] = int(count)
# Сортируем словарь по убыванию количества упоминаний и выводим 5 наиболее популярных имен
sorted_names = sorted(name_counts.items(), key=lambda x: x[1], reverse=True)
for name, count in sorted_names[:5]:
print(name)
```
Пример работы программы:
```
Введите имя файла: names.txt
Юля
Кирилл
Саша
Аня
Миша
```python
import os
filename = input("Введите имя файла: ")
if not os.path.exists(filename):
print("Файл не найден")
else:
# Создаем словарь для хранения количества упоминаний каждого имени
name_counts = {}
# Читаем данные из файла и подсчитываем количество упоминаний для каждого имени
with open(filename, 'r') as f:
for line in f:
name, count = line.strip().split()
if name in name_counts:
name_counts[name] += int(count)
else:
name_counts[name] = int(count)
# Сортируем словарь по убыванию количества упоминаний и выводим 5 наиболее популярных имен
sorted_names = sorted(name_counts.items(), key=lambda x: x[1], reverse=True)
for name, count in sorted_names[:5]:
print(name)
```
Пример работы программы:
```
Введите имя файла: names.txt
Юля
Кирилл
Саша
Аня
Миша
От ии, так что самому еще надо
Андрей Хмелёв
не работает, можете раставить Tab где они нужны
Похожие вопросы
- ЛЮДИ ПОМОГИТЕ У МЕНЯ ЭТОТ КОД НЕ РАБОТАЕТ НУЖНА ПОМОЩЬ ПИТОН ЗАВТРА СДАТЬ НАДО
- Нужна помощь в создании кодов
- Нужна помощь.(Язык программирования Python)
- Нужна помощь по PYTHON,заранее спасибо
- Python нужна помощь
- Очень нужна помощь с программой на Python! 1 курс матфака
- Python помощь в исправлении ошибок, очень нужна помощь!
- Нужна помощь в python
- Программисты нужна помощь
- Можете помочь! Нужен код для Python, что бы он заменял определенный текст в файле