Python

Срочно нужна помощь с кодом

В некотором файле содержатся детские имена. Каждое имя указано с новой строки. После имени через пробел записано одно целое число - количество названных этим именем детей. Имена в файле перемешаны в случайном порядке.

Напишите программу, которая считает данные из файла и выведет на экран 5 наиболее популярных имен (каждое в отдельной строке). Имя файла подается на вход и заранее не известно. Если указанного файла не существует, необходимо вывести сообщение "Файл не найден".

Пример:

Если в файле находятся следующие строки:

Аня 5

Саша 10

Кирилл 150

Игорь 1

Юля 999

Миша 2

Вы должны вывести имена Юля, Кирилл, Саша, Аня, Миша (в порядке убывания количества, каждое в отдельной строке)
Эффективное решение выглядит примерно так:
 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('Файл не найден')
Даниил Напоркин
Даниил Напоркин
87 571
Лучший ответ
Вот решение вашей задачи на 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
Юля
Кирилл
Саша
Аня
Миша
 
От ии, так что самому еще надо
Женя Мицук
Женя Мицук
6 445
Андрей Хмелёв не работает, можете раставить Tab где они нужны