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:
|
||||
|
||||
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]:
|
||||
#Распределение фильмов по жанрам.
|
||||
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
|
||||
|
||||
def save_movie_report(movies: list[dict]) -> str:
|
||||
|
||||
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")
|
||||
if not movies:
|
||||
print("Нет данных для анализа.")
|
||||
return
|
||||
|
||||
#Фильтрация по жанру Sci-Fi
|
||||
#Фильтрация по жанру Sci-Fi
|
||||
scifi_movies = filter_movies_by_genre(movies, "Sci-Fi")
|
||||
|
||||
#Средний рейтинг Sci-Fi
|
||||
#Средний рейтинг Sci-Fi
|
||||
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)
|
||||
|
||||
#Сохранинения топ-5 фильмов в файл
|
||||
#Сохранинения топ-5 фильмов в файл
|
||||
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)
|
||||
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()
|
||||
Loading…
Reference in New Issue
Block a user