10 function

This commit is contained in:
2026-05-07 22:47:22 +03:00
parent 95555911d3
commit 4a2e534fc7
3 changed files with 137 additions and 38 deletions
+115 -38
View File
@@ -1,74 +1,151 @@
#Система анализа рейтингов фильмов.
#Ñèñòåìà àíàëèçà ðåéòèíãîâ ôèëüìîâ.
import os
def parse_movie_line(line: str) -> dict:
return
#Принимает строку формата "название;год;рейтинг;жанр;число_голосов".
parts = line.strip().split(';')
if len(parts) != 5:
raise ValueError(f"Неверный формат строки: '{line}'")
title, year_str, rating_str, genre, votes_str = parts
return {
'title': title.strip(),
'year': int(year_str.strip()),
'rating': float(rating_str.strip()),
'genre': genre.strip(),
'votes': int(votes_str.strip())
}
def load_movies_from_file(filename: str) -> list[dict]:
return
#Читает файл, пропускает пустые строки.
movies = []
try:
with open(filename, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line:
movies.append(parse_movie_line(line))
except FileNotFoundError:
print(f"Ошибка: файл '{filename}' не найден.")
except Exception as e:
print(f"Ошибка при чтении файла: {e}")
return movies
def filter_movies_by_genre(movies: list[dict], genre: str) -> list[dict]:
return
#Фильтрация по жанру
return [m for m in movies if m['genre'].lower() == genre.lower()]
def calculate_average_rating(movies: list[dict]) -> float:
return
#Средний рейтинг списка фильмов. Если список пуст, возвращает 0.0.
if not movies:
return 0.0
total = sum(m['rating'] for m in movies)
return total / len(movies)
def get_top_n_movies(movies: list[dict], n: int) -> list[dict]:
return
#Возвращает n лучших фильмов: сортировка по рейтингу (убыв.),
#при равных рейтингах — по убыванию числа голосов.
sorted_movies = sorted(
movies,
key=lambda m: (m['rating'], m['votes']),
reverse=True
)
return sorted_movies[:n]
def get_movie_titles(movies: list[dict]) -> list[str]:
return
#Извлекает названия фильмов.
return [m['title'] for m in movies]
def count_movies_by_year(movies: list[dict]) -> dict[int, int]:
return
#Подсчёт количества фильмов по годам.
counts = {}
for m in movies:
year = m['year']
counts[year] = counts.get(year, 0) + 1
return dict(sorted(counts.items()))
def find_most_voted_movie(movies: list[dict]) -> dict:
return
#Фильм с максимальным числом голосов. При пустом списке — пустой словарь.
if not movies:
return {}
return max(movies, key=lambda m: m['votes'])
def genre_distribution(movies: list[dict]) -> dict[str, int]:
return
#Распределение фильмов по жанрам.
dist = {}
for m in movies:
genre = m['genre']
dist[genre] = dist.get(genre, 0) + 1
return dict(sorted(dist.items()))
def save_movie_report(movies: list[dict]) -> str:
return
def save_movie_report(movies: list[dict], filename: str) -> None:
#Сохраняет текстовый отчёт о фильмах в файл.
try:
directory = os.path.dirname(filename)
if directory and not os.path.exists(directory):
os.makedirs(directory)
with open(filename, 'w', encoding='utf-8') as f:
if not movies:
f.write("Нет данных\n")
return
for m in movies:
line = f"{m['title']} ({m['year']}) — Рейтинг: {m['rating']}, Жанр: {m['genre']}\n"
f.write(line)
except Exception as e:
print(f"Ошибка при сохранении файла '{filename}': {e}")
def main():
#Çàãðóçêà è îáðàáîòêà äàííûõ
#Загрузка и обработка данных
movies = load_movies_from_file("data/movies.txt")
#Ôèëüòðàöèÿ ïî æàíðó Sci-Fi
if not movies:
print("Нет данных для анализа.")
return
#Фильтрация по жанру Sci-Fi
scifi_movies = filter_movies_by_genre(movies, "Sci-Fi")
#Ñðåäíèé ðåéòèíã Sci-Fi
#Средний рейтинг Sci-Fi
avg_scifi = calculate_average_rating(scifi_movies)
#Òîï-5 Sci-Fi ôèëüìîâ
print(f"Средний рейтинг Sci-Fi фильмов: {avg_scifi:.2f}")
#Топ-5 Sci-Fi фильмов
top_scifi = get_top_n_movies(scifi_movies, 5)
#Ñîõðàíèíåíèÿ òîï-5 ôèëüìîâ â ôàéë
#Сохранинения топ-5 фильмов в файл
save_movie_report(top_scifi, "result/top5_scifi.txt")
#Íàçâàíèÿ ýòèõ 5 ôèëüìîâ
print("Топ-5 Sci‑Fi сохранён в result/top5_scifi.txt")
#Самый популярный фильм по числу голосов
titles_top = get_movie_titles(top_scifi)
#Ñàìûé ïîïóëÿðíûé ôèëüì ïî ÷èñëó ãîëîñîâ
print("\nНазвания топ-5 Sci-Fi фильмов:")
for title in titles_top:
print(f"- {title}")
#Самый популярный фильм по числу голосов
most_voted = find_most_voted_movie(movies)
#Ðàñïðåäåëåíèå ïî ãîäàì
if most_voted:
print(f"\nСамый популярный фильм (по числу голосов): "
f"{most_voted['title']} ({most_voted['year']})")
#Распределение по годам
year_counts = count_movies_by_year(movies)
#Ðàñïðåäåëåíèå ïî æàíðàì
print("\nРаспределение фильмов по годам:")
for year, count in year_counts.items():
print(f"{year}: {count}")
#Распределение по жанрам
genre_dist = genre_distribution(movies)
print("\nРаспределение по жанрам:")
for genre, count in genre_dist.items():
print(f"{genre}: {count}")
if __name__ == "__main__":
main()