From c873350d6046133f17837682fb392ce61b0e2c43 Mon Sep 17 00:00:00 2001 From: Dmitriy Kostarev Date: Sat, 2 Mar 2024 10:49:46 +0300 Subject: [PATCH 1/5] for challenges add solution --- for_challenges.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index 997754da..defcc183 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -2,7 +2,8 @@ # Необходимо вывести имена всех учеников из списка с новой строки names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? +for name in names: + print(name) # Задание 2 @@ -12,7 +13,8 @@ # Петя: 4 names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? +for name in names: + print(f'{name}: {len(name)}') # Задание 3 @@ -25,11 +27,15 @@ 'Маша': False, } names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? +for name in names: + if is_male[name]: + print(f'{name}: мужской') + else: + print(f'{name}: женский') # Задание 4 -# Даны группу учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней +# Даны группы учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней # Пример вывода: # Всего 2 группы. # Группа 1: 2 ученика. @@ -40,11 +46,14 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ['Оля', 'Петя', 'Гриша'], ] -# ??? + +print(f'Всего {len(groups)} групп(ы).') +for i in range(len(groups)): + print(f'Группа {i+1}: {len(groups[i])} ученика(ов)') # Задание 5 -# Для каждой пары учеников нужно с новой строки перечислить учеников, которые в неё входят +# Для каждой пары групп и учеников нужно с новой строки перечислить учеников, которые в неё входят # Пример вывода: # Группа 1: Вася, Маша # Группа 2: Оля, Петя, Гриша @@ -54,4 +63,5 @@ ['Оля', 'Петя', 'Гриша'], ['Вася', 'Маша', 'Саша', 'Женя'], ] -# ??? \ No newline at end of file +for i in range(len(groups)): + print(f'Группа {i}: {", ".join(groups[i])}') \ No newline at end of file From 4ba57242aecfc123e781b582199d966fbd233735 Mon Sep 17 00:00:00 2001 From: Dmitriy Kostarev Date: Sat, 2 Mar 2024 15:48:54 +0300 Subject: [PATCH 2/5] for_dict_challenges add solution --- for_dict_challenges.py | 82 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 11 deletions(-) diff --git a/for_dict_challenges.py b/for_dict_challenges.py index fd86d344..232362b7 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -12,9 +12,23 @@ {'first_name': 'Маша'}, {'first_name': 'Петя'}, ] -# ??? +def count_names(students: list) -> dict: + count_names = {} + for student in students: + if student['first_name'] not in count_names: + count_names[student['first_name']] = 1 + else: + count_names[student['first_name']] += 1 + return count_names + + +count_names_dict = count_names(students) + +for key, value in count_names_dict.items(): + print(f"{key}: {value}") + # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя # Пример вывода: @@ -26,9 +40,22 @@ {'first_name': 'Маша'}, {'first_name': 'Оля'}, ] -# ??? +def key_for_max_value(target_dict): + target_key = '' + max_value = 0 + for key, value in target_dict.items(): + if target_dict[key] > max_value: + target_key = key + max_value = target_dict[key] + return target_key + + +count_names_dict = count_names(students) +frequent_name = key_for_max_value(count_names_dict) +print(f'Самое частое имя среди учеников: {frequent_name}') + # Задание 3 # Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. # Пример вывода: @@ -44,15 +71,18 @@ {'first_name': 'Маша'}, {'first_name': 'Маша'}, {'first_name': 'Оля'}, - ],[ # это – третий класс + ], [ # это – третий класс {'first_name': 'Женя'}, {'first_name': 'Петя'}, {'first_name': 'Женя'}, {'first_name': 'Саша'}, ], ] -# ??? +for i in range(len(school_students)): + count_names_dict = count_names(school_students[i]) + frequent_name = key_for_max_value(count_names_dict) + print(f'Самое частое имя в классе {i + 1}: {frequent_name}') # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. @@ -61,10 +91,14 @@ # Класс 2б: девочки 0, мальчики 2 school = [ - {'class': '2a', 'students': [{'first_name': 'Маша'}, {'first_name': 'Оля'}]}, - {'class': '2б', 'students': [{'first_name': 'Олег'}, {'first_name': 'Миша'}]}, - {'class': '2в', 'students': [{'first_name': 'Даша'}, {'first_name': 'Олег'}, {'first_name': 'Маша'}]}, + {'class': '2a', + 'students': [{'first_name': 'Маша'}, {'first_name': 'Оля'}]}, + {'class': '2б', + 'students': [{'first_name': 'Олег'}, {'first_name': 'Миша'}]}, + {'class': '2в', 'students': [{'first_name': 'Даша'}, {'first_name': 'Олег'}, + {'first_name': 'Маша'}]}, ] + is_male = { 'Олег': True, 'Маша': False, @@ -72,9 +106,26 @@ 'Миша': True, 'Даша': False, } -# ??? +def count_gender(students: list, is_male: dict) -> dict: + count_genders = { + 'девочки': 0, + 'мальчики': 0, + } + for name in students: + if is_male[name['first_name']]: + count_genders['мальчики'] += 1 + else: + count_genders['девочки'] += 1 + return count_genders + + +for class_name in school: + count_genders = count_gender(class_name['students'], is_male) + print( + f"Класс {class_name['class']}: девочки {count_genders['девочки']}, мальчики {count_genders['мальчики']}") + # Задание 5 # По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков # Пример вывода: @@ -82,8 +133,10 @@ # Больше всего девочек в классе 2a school = [ - {'class': '2a', 'students': [{'first_name': 'Маша'}, {'first_name': 'Оля'}]}, - {'class': '3c', 'students': [{'first_name': 'Олег'}, {'first_name': 'Миша'}]}, + {'class': '2a', + 'students': [{'first_name': 'Маша'}, {'first_name': 'Оля'}]}, + {'class': '3c', + 'students': [{'first_name': 'Олег'}, {'first_name': 'Миша'}]}, ] is_male = { 'Маша': False, @@ -91,5 +144,12 @@ 'Олег': True, 'Миша': True, } -# ??? +girls = {} +boys = {} +for class_name in school: + count_genders = count_gender(class_name['students'], is_male) + girls[class_name['class']] = count_genders['девочки'] + boys[class_name['class']] = count_genders['мальчики'] +print(f'Больше всего девочек в классе {key_for_max_value(girls)}') +print(f'Больше всего мальчиков в классе {key_for_max_value(boys)}') From 97990c1ed9b2485d923c44494cd69d76d3fe8611 Mon Sep 17 00:00:00 2001 From: Dmitriy Kostarev Date: Sun, 3 Mar 2024 15:44:42 +0300 Subject: [PATCH 3/5] for_challenges fix after review; for_dict_challenges fix after review; for_dict_challenges_bonus add solution point 1, 2 --- for_challenges.py | 17 ++++++------- for_dict_challenges.py | 9 ++++--- for_dict_challenges_bonus.py | 48 ++++++++++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index defcc183..348171f5 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -5,7 +5,6 @@ for name in names: print(name) - # Задание 2 # Необходимо вывести имена всех учеников из списка, рядом с именем показать количество букв в нём # Пример вывода: @@ -16,7 +15,6 @@ for name in names: print(f'{name}: {len(name)}') - # Задание 3 # Необходимо вывести имена всех учеников из списка, рядом с именем вывести пол ученика @@ -28,11 +26,13 @@ } names = ['Оля', 'Петя', 'Вася', 'Маша'] for name in names: - if is_male[name]: - print(f'{name}: мужской') + if name in is_male: + if is_male.get(name): + print(f'{name}: мужской') + else: + print(f'{name}: женский') else: - print(f'{name}: женский') - + print(f'Имени {name} нет в словаре') # Задание 4 # Даны группы учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней @@ -49,8 +49,7 @@ print(f'Всего {len(groups)} групп(ы).') for i in range(len(groups)): - print(f'Группа {i+1}: {len(groups[i])} ученика(ов)') - + print(f'Группа {i + 1}: {len(groups[i])} ученика(ов)') # Задание 5 # Для каждой пары групп и учеников нужно с новой строки перечислить учеников, которые в неё входят @@ -64,4 +63,4 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ] for i in range(len(groups)): - print(f'Группа {i}: {", ".join(groups[i])}') \ No newline at end of file + print(f'Группа {i + 1}: {", ".join(groups[i])}') diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 232362b7..a93dafd7 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -114,10 +114,13 @@ def count_gender(students: list, is_male: dict) -> dict: 'мальчики': 0, } for name in students: - if is_male[name['first_name']]: - count_genders['мальчики'] += 1 + if name['first_name'] in is_male: + if is_male.get(name['first_name']): + count_genders['мальчики'] += 1 + else: + count_genders['девочки'] += 1 else: - count_genders['девочки'] += 1 + print(f"Имя {name['first_name']} не найдено в словаре") return count_genders diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 9f35a0a0..657dc703 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -30,9 +30,9 @@ Весь код стоит разбить на логические части с помощью функций. """ +import datetime import random import uuid -import datetime import lorem @@ -66,5 +66,49 @@ def generate_chat_history(): return messages +def count_values(messages: list, target_field: str) -> dict: + count_values = {} + for message in messages: + if message[target_field] not in count_values: + count_values[message[target_field]] = 1 + else: + count_values[message[target_field]] += 1 + return count_values + + +def key_for_max_value(target_dict): + target_key = '' + max_value = 0 + for key, value in target_dict.items(): + if target_dict[key] > max_value: + target_key = key + max_value = target_dict[key] + return target_key + + +def count_replies(messages: list): + replies = [] + user_message_replies = {} + + for message in messages: + if message['reply_for']: + replies.append(message['reply_for']) + user_message_replies[message['sent_by']] = 0 + + for message in messages: + if message['id'] in replies: + user_message_replies[message['sent_by']] += 1 + + return user_message_replies + + +print() + if __name__ == "__main__": - print(generate_chat_history()) + chat_history = generate_chat_history() + # print(generate_chat_history()) + user_count_messages = count_values(chat_history, 'sent_by') + print( + f'Наибольшее число сообщений у пользователя id = {key_for_max_value(user_count_messages)}') + print( + f'Наибольшее число ответов на сообщение пользователя id = {key_for_max_value(count_replies(chat_history))}') From b4351adfa9b0ecfe8f7c59d478570485af4a5c39 Mon Sep 17 00:00:00 2001 From: Dmitriy Kostarev Date: Sun, 3 Mar 2024 15:50:00 +0300 Subject: [PATCH 4/5] for_dict_challenges_bonus fix bugs --- for_dict_challenges_bonus.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 657dc703..280d42ab 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -87,13 +87,13 @@ def key_for_max_value(target_dict): def count_replies(messages: list): - replies = [] + replies = set() user_message_replies = {} for message in messages: + user_message_replies[message['sent_by']] = 0 if message['reply_for']: - replies.append(message['reply_for']) - user_message_replies[message['sent_by']] = 0 + replies.add(message['reply_for']) for message in messages: if message['id'] in replies: From 506d43e1f8d855ed152d04df7eaeb90198b23bb2 Mon Sep 17 00:00:00 2001 From: Dmitriy Kostarev Date: Sat, 9 Mar 2024 16:33:41 +0300 Subject: [PATCH 5/5] add solution point 3 --- for_dict_challenges_bonus.py | 52 +++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 280d42ab..dba10801 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -37,7 +37,7 @@ import lorem -def generate_chat_history(): +def generate_chat_history() -> list: messages_amount = random.randint(200, 1000) users_ids = list( {random.randint(1, 10000) for _ in range(random.randint(5, 20))} @@ -76,17 +76,12 @@ def count_values(messages: list, target_field: str) -> dict: return count_values -def key_for_max_value(target_dict): - target_key = '' - max_value = 0 - for key, value in target_dict.items(): - if target_dict[key] > max_value: - target_key = key - max_value = target_dict[key] - return target_key +def keys_for_max_values(target_dict: dict) -> list: + max_value = max(target_dict.values()) + return [str(key) for key in target_dict if target_dict[key] == max_value] -def count_replies(messages: list): +def count_replies(messages: list) -> dict: replies = set() user_message_replies = {} @@ -104,11 +99,38 @@ def count_replies(messages: list): print() +messages = generate_chat_history() + + +def count_unique_users_seen(messages: list) -> dict: + users_seen_messages = {} + for message in messages: + if message['sent_by'] not in users_seen_messages: + users_seen_messages[message['sent_by']] = [] + + for message in messages: + users_seen_messages[message['sent_by']] += message['seen_by'] + + count_users_seen_messages = {} + for k, v in users_seen_messages.items(): + count_users_seen_messages[k] = len(set(v)) + + return count_users_seen_messages + + if __name__ == "__main__": chat_history = generate_chat_history() # print(generate_chat_history()) - user_count_messages = count_values(chat_history, 'sent_by') - print( - f'Наибольшее число сообщений у пользователя id = {key_for_max_value(user_count_messages)}') - print( - f'Наибольшее число ответов на сообщение пользователя id = {key_for_max_value(count_replies(chat_history))}') + if len(chat_history) > 0: + user_count_messages = count_values(chat_history, 'sent_by') + print( + f'Наибольшее число сообщений у: ' + f'{", ".join(keys_for_max_values(user_count_messages))}') + print( + f'Пользователи, на сообщения которых больше всего отвечали: ' + f'{", ".join(keys_for_max_values(count_replies(chat_history)))}') + print( + f'Пользователи сообщения которых видело больше всего уникальных пользователей: ' + f'{", ".join(keys_for_max_values(count_unique_users_seen(chat_history)))}') + else: + print('В списке нет сообщений.')