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

1
README.md Normal file
View File

@ -0,0 +1 @@
# Анализ рейтингов фильмов

View File

@ -0,0 +1,21 @@
The Shawshank Redemption;1994;9.3;Drama;2500000
The Godfather;1972;9.2;Crime;1800000
The Dark Knight;2008;9.0;Action;2400000
Pulp Fiction;1994;8.9;Crime;1900000
Schindler's List;1993;8.9;Drama;1300000
Inception;2010;8.8;Sci-Fi;2200000
Fight Club;1999;8.8;Drama;2000000
Forrest Gump;1994;8.8;Drama;1900000
The Matrix;1999;8.7;Sci-Fi;1800000
Interstellar;2014;8.6;Sci-Fi;1700000
The Lord of the Rings: The Return of the King;2003;8.9;Fantasy;1800000
Star Wars: Episode V - The Empire Strikes Back;1980;8.7;Sci-Fi;1600000
The Silence of the Lambs;1991;8.6;Thriller;1400000
Se7en;1995;8.6;Thriller;1500000
The Green Mile;1999;8.6;Drama;1300000
Blade Runner;1982;8.1;Sci-Fi;900000
Alien;1979;8.2;Sci-Fi;850000
The Terminator;1984;8.1;Sci-Fi;950000
Back to the Future;1985;8.5;Sci-Fi;1200000
2001: A Space Odyssey;1968;8.3;Sci-Fi;750000
The Martian;2015;8.0;Sci-Fi;1050000

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 SciFi сохранён в 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()