Skip to content

Commit 91da848

Browse files
committed
Challenge 13 complete
1 parent eea907e commit 91da848

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

days/04-06 collections/challenge_13.py

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,61 @@
11
import csv
22
from collections import defaultdict, namedtuple, Counter
3+
from statistics import mean
34

4-
MOVIE_DATA = 'movie_metadata.csv'
5+
MOVIE_DATA = 'days/04-06 collections/movie_metadata.csv'
56
NUM_TOP_DIRECTORS = 20
67
MIN_MOVIES = 4
78
MIN_YEAR = 1960
89

9-
Movie = namedtuple('Movie', 'director title year score')
10+
Movie = namedtuple('Movie', 'title year score')
1011

1112
def get_movies_by_director(data):
1213
'''Extracts all movies from csv and stores them in a dictionary
1314
where keys are directors, and values is a list of movies (named tuples)'''
15+
directors = defaultdict(list)
1416
with open(data, newline='',encoding='utf8') as csvfile:
1517
reader = csv.DictReader(csvfile)
16-
headers = reader.fieldnames
17-
keep = ['director_name', 'movie_title', 'title_year', 'imdb_rating']
18-
for row in reader if keep in headers:
19-
print(row)
20-
21-
return
18+
for row in reader:
19+
if int(row['title_year'].replace('','0')) >= MIN_MOVIES:
20+
directors[row['director_name']].append(
21+
Movie(row['movie_title'], row['title_year'], row['imdb_score'])
22+
)
23+
return directors
2224

2325

2426

25-
def get_average_scores(movies):
27+
def get_average_scores(directors):
2628
'''Filter directors with < MIN_MOVIES and calculate averge score'''
29+
# dictionary with tuples as keys, and lists as values, confusing AF
30+
directors = {(director, _calc_mean(movies)) : movies for director, movies in directors.items() if len(movies) > MIN_MOVIES}
2731
return directors
2832

29-
3033
def _calc_mean(movies):
3134
'''Helper method to calculate mean of list of Movie namedtuples'''
32-
pass
35+
return round(mean([float(movie.score.replace('','0')) for movie in movies]),2)
3336

3437

35-
def print_results(movies):
38+
def print_results(directors):
3639
'''Print directors ordered by highest average rating. For each director
3740
print his/her movies also ordered by highest rated movie.
3841
See http://pybit.es/codechallenge13.html for example output'''
39-
fmt_director_entry = '{counter}. {director:<52} {avg}'
40-
fmt_movie_entry = '{year}] {title:<50} {score}'
41-
sep_line = '-' * 60
42-
pass
42+
counter = 1
43+
for (director, avg), movie in sorted(directors.items(), key = lambda x: x[0][1], reverse=True):
44+
fmt_director_entry = f'{counter}. {director:<52} {avg}'
45+
print(fmt_director_entry)
46+
for item in movie:
47+
fmt_movie_entry = f'{item.year}] {item.title:<50} {item.score}'
48+
print(fmt_movie_entry)
49+
sep_line = '-' * 60
50+
print(sep_line)
51+
counter += 1
52+
if counter == 21:
53+
break
54+
return
4355

4456

4557
def main():
46-
47-
get_movies_by_director(MOVIE_DATA)
58+
print_results(get_average_scores(get_movies_by_director(MOVIE_DATA)))
4859

4960

5061
if __name__ == '__main__':

0 commit comments

Comments
 (0)