From 221046b600e9bd372db165ac395d1b9304cf3265 Mon Sep 17 00:00:00 2001 From: Tyler Z Date: Thu, 20 Jul 2023 22:40:17 -0500 Subject: [PATCH 1/3] Update based on feedback --- 52/zambam5/timer.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 52/zambam5/timer.py diff --git a/52/zambam5/timer.py b/52/zambam5/timer.py new file mode 100644 index 00000000..eec15e09 --- /dev/null +++ b/52/zambam5/timer.py @@ -0,0 +1,49 @@ +import platform + +from datetime import datetime, timedelta +from time import sleep + +if platform.system() == "Windows": + from winsound import Beep + + +def pomodoro_timer(minutes: int = 20, beep: bool = False) -> None: + """ + Take a duration in minutes and sleep for that amount of time + """ + minutes_delta = timedelta(minutes=minutes) + date_now = datetime.now() + date_after_minutes = date_now + minutes_delta + print( + "Starting timer " + str(date_now), + "\r\nTimer will stop at " + str(date_after_minutes), + ) + sleep(minutes_delta.seconds) + if beep and platform.system() == "Windows": + Beep(frequency=500, duration=50) + pass + + +def main() -> None: + if platform.system() == "Windows": + beep = False + b_question = input( + 'Do you want the timer to beep when finished? Answer "yes" or "no" ' + ) + if b_question == "yes": + beep = True + else: + beep = False + while True: + pomodoro_timer(beep=beep) + again = input( + 'Do you want to start the timer again? Answer "yes" or "no" only ' + ) + if again == "no": + print("Ending the loop, hope you got some good work done!") + sleep(0.5) + break + + +if __name__ == "__main__": + main() From 8e6d4c8ec3406741eb202b131c0e7caac104696a Mon Sep 17 00:00:00 2001 From: Tyler Z Date: Fri, 21 Jul 2023 00:52:36 -0500 Subject: [PATCH 2/3] Finished challenge --- 13/zambam5/directors.py | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 13/zambam5/directors.py diff --git a/13/zambam5/directors.py b/13/zambam5/directors.py new file mode 100644 index 00000000..3f2bb1ea --- /dev/null +++ b/13/zambam5/directors.py @@ -0,0 +1,70 @@ +# python3.11 +from collections import defaultdict, namedtuple +import csv +from urllib.request import urlretrieve + +# Note to start: in python 3.11 csv.DectReader rows are dicts, not OrderedDicts + +MOVIES_FILE = "movie_metadata.csv" +MINIMUM_MOVIES = 4 +MINIMUM_YEAR = 1960 + +Movie = namedtuple("Movie", "title year score") + + +def get_directors_from_csv() -> defaultdict: + """ + Organize the data from the provided csv in a convenient way + No movies before 1960 + Remove superflous data + Some entries do not have years provided, so we use try-except to ignore those + """ + directors = defaultdict(list) + # a dict with directors as keys and a list of data for each of their movies as values + with open(MOVIES_FILE, encoding="utf-8") as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + try: + year = int(row["title_year"]) + if year >= MINIMUM_YEAR: + title = row["movie_title"].replace("\xa0", "").replace("\xc2", "") + score = float(row["imdb_score"]) + movie = Movie(title, year, score) + directors[row["director_name"]].append(movie) + except ValueError: + continue + return directors + + +def get_director_average_scores(directors: defaultdict) -> dict: + """ + Return dict of directors and their average imbd scores + """ + director_averages = dict() + for director, movies in directors.items(): + number_of_movies = len(movies) + total_score = sum([movie.score for movie in movies]) + director_averages[director] = round(total_score / number_of_movies, 1) + return director_averages + + +def print_top_directors(directors: defaultdict) -> None: + """ + Print the top 20 directors as directed in the challenge + """ + averages = get_director_average_scores(directors) + averages_filtered = dict() + for director, movies in directors.items(): + if len(movies) >= MINIMUM_MOVIES: + averages_filtered[director] = averages[director] + directors_sorted = sorted(averages_filtered, key=lambda x: -averages_filtered[x]) + for counter, director in enumerate(directors_sorted[:20], 1): + print(f"{counter:02}. {director:<52} {averages[director]}") + print("-" * 60) + for movie in directors[director]: + print(f"{movie.year}] {movie.title:<50} {movie.score}") + print(" ") + + +directors = get_directors_from_csv() +print_top_directors(directors) From 1d164a59f5d9696fb573f6c859a35d8394ec650f Mon Sep 17 00:00:00 2001 From: Tyler Date: Fri, 21 Jul 2023 00:59:29 -0500 Subject: [PATCH 3/3] Delete timer.py This was not supposed to be in this commit, I'm not sure why it is --- 52/zambam5/timer.py | 49 --------------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 52/zambam5/timer.py diff --git a/52/zambam5/timer.py b/52/zambam5/timer.py deleted file mode 100644 index eec15e09..00000000 --- a/52/zambam5/timer.py +++ /dev/null @@ -1,49 +0,0 @@ -import platform - -from datetime import datetime, timedelta -from time import sleep - -if platform.system() == "Windows": - from winsound import Beep - - -def pomodoro_timer(minutes: int = 20, beep: bool = False) -> None: - """ - Take a duration in minutes and sleep for that amount of time - """ - minutes_delta = timedelta(minutes=minutes) - date_now = datetime.now() - date_after_minutes = date_now + minutes_delta - print( - "Starting timer " + str(date_now), - "\r\nTimer will stop at " + str(date_after_minutes), - ) - sleep(minutes_delta.seconds) - if beep and platform.system() == "Windows": - Beep(frequency=500, duration=50) - pass - - -def main() -> None: - if platform.system() == "Windows": - beep = False - b_question = input( - 'Do you want the timer to beep when finished? Answer "yes" or "no" ' - ) - if b_question == "yes": - beep = True - else: - beep = False - while True: - pomodoro_timer(beep=beep) - again = input( - 'Do you want to start the timer again? Answer "yes" or "no" only ' - ) - if again == "no": - print("Ending the loop, hope you got some good work done!") - sleep(0.5) - break - - -if __name__ == "__main__": - main()