10 function
This commit is contained in:
parent
95555911d3
commit
4a2e534fc7
@ -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
|
||||||
133
src/main.py
133
src/main.py
@ -1,74 +1,151 @@
|
|||||||
|
#Система анализа рейтингов фильмов.
|
||||||
|
|
||||||
#Система анализа рейтингов фильмов.
|
import os
|
||||||
|
|
||||||
|
|
||||||
def parse_movie_line(line: str) -> dict:
|
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]:
|
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]:
|
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:
|
def calculate_average_rating(movies: list[dict]) -> float:
|
||||||
|
#Средний рейтинг списка фильмов. Если список пуст, возвращает 0.0.
|
||||||
return
|
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]:
|
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]:
|
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]:
|
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:
|
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]:
|
def genre_distribution(movies: list[dict]) -> dict[str, int]:
|
||||||
|
#Распределение фильмов по жанрам.
|
||||||
|
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], 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
|
return
|
||||||
|
for m in movies:
|
||||||
def save_movie_report(movies: list[dict]) -> str:
|
line = f"{m['title']} ({m['year']}) — Рейтинг: {m['rating']}, Жанр: {m['genre']}\n"
|
||||||
|
f.write(line)
|
||||||
return
|
except Exception as e:
|
||||||
|
print(f"Ошибка при сохранении файла '{filename}': {e}")
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
#Загрузка и обработка данных
|
#Загрузка и обработка данных
|
||||||
movies = load_movies_from_file("data/movies.txt")
|
movies = load_movies_from_file("data/movies.txt")
|
||||||
|
if not movies:
|
||||||
|
print("Нет данных для анализа.")
|
||||||
|
return
|
||||||
|
|
||||||
#Фильтрация по жанру Sci-Fi
|
#Фильтрация по жанру Sci-Fi
|
||||||
scifi_movies = filter_movies_by_genre(movies, "Sci-Fi")
|
scifi_movies = filter_movies_by_genre(movies, "Sci-Fi")
|
||||||
|
|
||||||
#Средний рейтинг Sci-Fi
|
#Средний рейтинг Sci-Fi
|
||||||
avg_scifi = calculate_average_rating(scifi_movies)
|
avg_scifi = calculate_average_rating(scifi_movies)
|
||||||
|
print(f"Средний рейтинг Sci-Fi фильмов: {avg_scifi:.2f}")
|
||||||
|
|
||||||
#Топ-5 Sci-Fi фильмов
|
#Топ-5 Sci-Fi фильмов
|
||||||
top_scifi = get_top_n_movies(scifi_movies, 5)
|
top_scifi = get_top_n_movies(scifi_movies, 5)
|
||||||
|
|
||||||
#Сохранинения топ-5 фильмов в файл
|
#Сохранинения топ-5 фильмов в файл
|
||||||
save_movie_report(top_scifi, "result/top5_scifi.txt")
|
save_movie_report(top_scifi, "result/top5_scifi.txt")
|
||||||
|
print("Топ-5 Sci‑Fi сохранён в result/top5_scifi.txt")
|
||||||
|
|
||||||
#Названия этих 5 фильмов
|
#Самый популярный фильм по числу голосов
|
||||||
titles_top = get_movie_titles(top_scifi)
|
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)
|
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)
|
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)
|
genre_dist = genre_distribution(movies)
|
||||||
|
print("\nРаспределение по жанрам:")
|
||||||
|
for genre, count in genre_dist.items():
|
||||||
|
print(f"{genre}: {count}")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
Loading…
Reference in New Issue
Block a user