From bf7a9848a024b4a86a19fe7f14662e53ca837df5 Mon Sep 17 00:00:00 2001 From: Prokhorov Mark Date: Sat, 18 Feb 2023 22:51:04 +0300 Subject: [PATCH 1/3] everything but the bonus --- for_challenges.py | 19 +++++++++-- for_dict_challenges.py | 77 +++++++++++++++++++++++++++++++++++++++--- string_challenges.py | 23 +++++++++---- 3 files changed, 105 insertions(+), 14 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index 997754da..30aaf1dd 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(name, len(name)) # Задание 3 @@ -24,6 +26,11 @@ 'Вася': True, 'Маша': False, } +for name in is_male: + if is_male[name] == True: + print(f'{name}, мужской пол') + else: + print(f'{name}, женский пол') names = ['Оля', 'Петя', 'Вася', 'Маша'] # ??? @@ -40,6 +47,9 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ['Оля', 'Петя', 'Гриша'], ] +print(f'Всего груп: {len(groups)}') +for group in range(len(groups)): + print(f'Группа {group+1}: {len(groups[group])} ученика') # ??? @@ -54,4 +64,7 @@ ['Оля', 'Петя', 'Гриша'], ['Вася', 'Маша', 'Саша', 'Женя'], ] -# ??? \ No newline at end of file +# ??? +for group in range(len(groups)): + print(f'Группа {group+1}:', end=' ') + print(*groups[group], sep=', ') diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 96062ebc..5c874f1f 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -12,9 +12,18 @@ {'first_name': 'Маша'}, {'first_name': 'Петя'}, ] -# ??? +names = {} +for student in students: + name = student['first_name'] + if names.get(name) == None: + names[name] = 1 + else: + names[name] += 1 +for i in names: + print(f'{i}: {names[i]}') + # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя # Пример вывода: @@ -26,7 +35,19 @@ {'first_name': 'Маша'}, {'first_name': 'Оля'}, ] -# ??? + + +names = {} +for student in students: + name = student['first_name'] + if names.get(name) == None: + names[name] = 1 + else: + names[name] += 1 +max_number_repetitions = max(names.values()) +for i in names: + if names[i] == max_number_repetitions: + print(f'Самое частое имя среди учеников: {i}') # Задание 3 @@ -51,7 +72,22 @@ {'first_name': 'Саша'}, ], ] -# ??? + + +class_counter = 1 +for grade in school_students: + names = {} + for student in grade: + name = student['first_name'] + if names.get(name) == None: + names[name] = 1 + else: + names[name] += 1 + max_number_repetitions = max(names.values()) + for i in names: + if names[i] == max_number_repetitions: + print(f'Самое частое имя в классе {class_counter}: {i}') + class_counter += 1 # Задание 4 @@ -72,9 +108,18 @@ 'Миша': True, 'Даша': False, } -# ??? +for grade in school: + boys = girls = 0 + name_grade = grade['class'] + for student in grade['students']: + if is_male[student['first_name']] == True: + boys += 1 + else: + girls += 1 + print(f'Класс {name_grade}: мальчики {boys}, девочки {girls}') + # Задание 5 # По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков # Пример вывода: @@ -91,5 +136,27 @@ 'Олег': True, 'Миша': True, } -# ??? + +boy = {} +girl = {} +for grade in school: + boys = girls = 0 + name_grade = grade['class'] + for student in grade['students']: + if is_male[student['first_name']] == True: + boys += 1 + else: + girls += 1 + boy[name_grade] = boys + girl[name_grade] = girls + + +max_boy = max(boy.values()) +max_girl = max(girl.values()) +for i in boy: + if boy[i] == max_boy: + print(f'Больше всего мальчиков в классе {i}') +for i in girl: + if girl[i] == max_girl: + print(f'Больше всего девочек в классе {i}') diff --git a/string_challenges.py b/string_challenges.py index 856add2d..5409578c 100644 --- a/string_challenges.py +++ b/string_challenges.py @@ -1,28 +1,39 @@ # Вывести последнюю букву в слове word = 'Архангельск' -# ??? +print(word[-1]) # Вывести количество букв "а" в слове word = 'Архангельск' -# ??? +print(len(word)) # Вывести количество гласных букв в слове word = 'Архангельск' -# ??? +vowels = ['а', 'о', 'у', 'ы', 'э', 'е', 'ё', 'и', 'ю', 'я'] +count = 0 +for letter in word: + if letter.lower() in vowels: + count += 1 +print(count) # Вывести количество слов в предложении sentence = 'Мы приехали в гости' -# ??? +print(len(sentence.split())) # Вывести первую букву каждого слова на отдельной строке sentence = 'Мы приехали в гости' -# ??? +for word in sentence.split(): + print(word[0]) # Вывести усреднённую длину слова в предложении sentence = 'Мы приехали в гости' -# ??? \ No newline at end of file +count_words = len(sentence.split()) +count_letters = 0 +for word in sentence.split(): + count_letters += len(word) +average_length = count_letters / count_words +print(average_length) \ No newline at end of file From ff3161792fd21f32bbfae1fa35b670415cc93730 Mon Sep 17 00:00:00 2001 From: Prokhorov Mark Date: Sun, 19 Feb 2023 15:51:54 +0300 Subject: [PATCH 2/3] bonus task completed --- for_dict_challenges_bonus.py | 141 +++++++++++++++++++++++++++++++++-- 1 file changed, 136 insertions(+), 5 deletions(-) diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index c48db990..f4fb2fa2 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -22,11 +22,11 @@ Установите библиотеку lorem, чтобы она работала. Нужно: -1. Вывести айди пользователя, который написал больше всех сообщений. +1. Вывести айди пользователя, который написал больше всех сообщений. 2. Вывести айди пользователя, на сообщения которого больше всего отвечали. -3. Вывести айди пользователей, сообщения которых видело больше всего уникальных пользователей. -4. Определить, когда в чате больше всего сообщений: утром (до 12 часов), днём (12-18 часов) или вечером (после 18 часов). -5. Вывести идентификаторы сообщений, который стали началом для самых длинных тредов (цепочек ответов). +3$. Вывести айди пользователей, сообщения которых видело больше всего уникальных пользователей. +4$. Определить, когда в чате больше всего сообщений: утром (до 12 часов), днём (12-18 часов) или вечером (после 18 часов). +5$. Вывести идентификаторы сообщений, который стали началом для самых длинных тредов (цепочек ответов). Весь код стоит разбить на логические части с помощью функций. """ @@ -55,5 +55,136 @@ def generate_chat_history(): return messages +def user_messages(messages): # 'id пользователя: список с id всех его сообщений + user_messages = {} + for _ in messages: + sender_id = _['sent_by'] + message_id = _['id'] + + if user_messages.get(sender_id) == None: + user_messages[sender_id] = [message_id] + else: + user_messages[sender_id].append(message_id) + return user_messages # 'id пользователя: список с id всех его сообщений +def first_issue(user_messages): + wrote_the_most = max(user_messages.values(), key=len) + for _ in user_messages: + if user_messages[_] == wrote_the_most: + wrote_the_most = _ + return wrote_the_most + + +def number_answers(messages): + number_answers = {} + for _ in messages: + if _['reply_for'] != None and _['reply_for'] != []: + if _['reply_for'] in number_answers: + number_answers[_['reply_for']] += 1 + else: + number_answers[_['reply_for']] = 1 + return number_answers +def second_issue(number_answers): + number_responses_per_user = {} + for _ in chat_history: + message_id = _['id'] + for i in number_answers: + if i == message_id: + if number_responses_per_user.get(_['sent_by']) == None: + number_responses_per_user[_['sent_by']] = number_answers[i] + else: + number_responses_per_user[_['sent_by']] += number_answers[i] + most_cited = max(number_responses_per_user.values()) + for _ in number_responses_per_user: + if number_responses_per_user[_] == most_cited: + most_cited = _ + return most_cited + + +def how_many_views(user_messages): + how_many_views = {} + reply = [] + for _ in user_messages: + who_saw = [] + message_list = user_messages[_] + for i in message_list: + for j in chat_history: + if j['id'] == i: + who_saw += j['seen_by'] + how_many_views[_] = len(who_saw) + most_viewed = max(how_many_views.values()) + for _ in how_many_views: + if how_many_views[_] == most_viewed: + reply.append(_) + return reply + + +def sending_time(messages): + sending_time = { + 'morning': 0, + 'day': 0, + 'evening': 0, + 'night': 0 + } + for _ in messages: + time = int(_['sent_at'].strftime('%H')) + if 6 <= time < 12: + sending_time['morning'] += 1 + elif 12 <= time < 18: + sending_time['day'] += 1 + elif 18 <= time < 23: + sending_time['evening'] += 1 + else: + sending_time['night'] += 1 + busiest_time = max(sending_time.values()) + for _ in sending_time: + if sending_time[_] == busiest_time: + return _ + + +def is_there_answer(id): + for _ in chat_history: + if _['reply_for'] == id: + return True + return False +def reply_for_from_id(id): + for _ in chat_history: + if _['id'] == id: + return _['reply_for'] +def message_threads(messages): + message_threads = {} + reply = [] + for _ in messages: + answer = is_there_answer(_['id']) + count = 0 + by = _['id'] + beginning = _['reply_for'] + if answer == False: + while beginning != None and beginning != []: + by = beginning + beginning = reply_for_from_id(beginning) + count += 1 + if count > 0: + message_threads[by] = count + + max_branch_length = max(message_threads.values()) + + for _ in message_threads: + if message_threads[_] == max_branch_length: + reply.append(_) + return reply + + if __name__ == "__main__": - print(generate_chat_history()) + chat_history = generate_chat_history() + + print(f'ID пользователя, который написал больше всех сообщений: {first_issue(user_messages(chat_history))}', end='\n\n') + + print(f'ID пользователя, на которого больше всего отвечали: {second_issue(number_answers(chat_history))}', end='\n\n') #2 + + print('ID пользователя с наибольшим кол-ом просмотров:', end=' ') #3 + print(*how_many_views(user_messages(chat_history)), end='\n\n') + + print(f'Больше всего сообщений: {sending_time(chat_history)}', end='\n\n') #4 + + print('Начало для самых длинных тредов:', end='\n') #5 + print(*message_threads(chat_history), sep='\n') \ No newline at end of file From 1d0539f6cba1eb5966cb03046219044af126d7c5 Mon Sep 17 00:00:00 2001 From: Prokhorov Mark Date: Fri, 24 Feb 2023 13:40:25 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8.=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20if.=20=D0=9E=D0=B1=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=83=D0=BB=20=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=B2=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B5=D0=B9=D1=88=D0=B5=D0=B3=D0=BE=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +++ for_challenges.py | 4 +- for_dict_challenges.py | 101 +++++++++++------------------ for_dict_challenges_bonus.py | 122 +++++++++++++++-------------------- 4 files changed, 101 insertions(+), 134 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6eab5a0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +settings.py +*.log +.vscode/ +.idea/ +env/ +.DS_Store +__pycache__/ +/env \ No newline at end of file diff --git a/for_challenges.py b/for_challenges.py index 30aaf1dd..0e788c16 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -27,7 +27,7 @@ 'Маша': False, } for name in is_male: - if is_male[name] == True: + if is_male[name]: print(f'{name}, мужской пол') else: print(f'{name}, женский пол') @@ -47,7 +47,7 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ['Оля', 'Петя', 'Гриша'], ] -print(f'Всего груп: {len(groups)}') +print(f'Всего групп: {len(groups)}') for group in range(len(groups)): print(f'Группа {group+1}: {len(groups[group])} ученика') # ??? diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 5c874f1f..ea481e97 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -13,16 +13,15 @@ {'first_name': 'Петя'}, ] +def number_of_times_of_name(students): + names = {} + for student in students: + name = student['first_name'] + names[name] = names.get(name, 0) + 1 + return names -names = {} -for student in students: - name = student['first_name'] - if names.get(name) == None: - names[name] = 1 - else: - names[name] += 1 -for i in names: - print(f'{i}: {names[i]}') +for repetition_rate in number_of_times_of_name(students): + print(f'{repetition_rate}: {number_of_times_of_name(students)[repetition_rate]}') # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя @@ -36,19 +35,13 @@ {'first_name': 'Оля'}, ] +def most_common_name(students): + max_number_repetitions = max(number_of_times_of_name(students).values()) + for repetition_rate in number_of_times_of_name(students): + if number_of_times_of_name(students)[repetition_rate] == max_number_repetitions: + return repetition_rate -names = {} -for student in students: - name = student['first_name'] - if names.get(name) == None: - names[name] = 1 - else: - names[name] += 1 -max_number_repetitions = max(names.values()) -for i in names: - if names[i] == max_number_repetitions: - print(f'Самое частое имя среди учеников: {i}') - +print(f'Самое повторяющиеся имя: {most_common_name(students)}') # Задание 3 # Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. @@ -76,20 +69,9 @@ class_counter = 1 for grade in school_students: - names = {} - for student in grade: - name = student['first_name'] - if names.get(name) == None: - names[name] = 1 - else: - names[name] += 1 - max_number_repetitions = max(names.values()) - for i in names: - if names[i] == max_number_repetitions: - print(f'Самое частое имя в классе {class_counter}: {i}') + print(f'Самое повторяющиеся имя в {class_counter} классе: {most_common_name(grade)}') class_counter += 1 - # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: @@ -109,16 +91,22 @@ 'Даша': False, } +def number_of_boys_and_girls(grade): + students = grade['students'] + gender = {'boys': 0, 'girls': 0} + for student in students: + name = student['first_name'] + if is_male[name] == True: + gender['boys'] += 1 + else: + gender['girls'] += 1 + return gender for grade in school: - boys = girls = 0 - name_grade = grade['class'] - for student in grade['students']: - if is_male[student['first_name']] == True: - boys += 1 - else: - girls += 1 - print(f'Класс {name_grade}: мальчики {boys}, девочки {girls}') + number_of_boys = number_of_boys_and_girls(grade)['boys'] + number_of_girls = number_of_boys_and_girls(grade)['girls'] + name_grade = grade['class'] + print(f'Класс {name_grade}: девочки {number_of_girls}, мальчики {number_of_boys}') # Задание 5 # По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков @@ -137,26 +125,13 @@ 'Миша': True, } - -boy = {} -girl = {} +max_boys = max_girls = 0 for grade in school: - boys = girls = 0 - name_grade = grade['class'] - for student in grade['students']: - if is_male[student['first_name']] == True: - boys += 1 - else: - girls += 1 - boy[name_grade] = boys - girl[name_grade] = girls - - -max_boy = max(boy.values()) -max_girl = max(girl.values()) -for i in boy: - if boy[i] == max_boy: - print(f'Больше всего мальчиков в классе {i}') -for i in girl: - if girl[i] == max_girl: - print(f'Больше всего девочек в классе {i}') + if max_boys < number_of_boys_and_girls(grade)['boys']: + max_boys = number_of_boys_and_girls(grade)['boys'] + class_max_boys = grade['class'] + if max_girls < number_of_boys_and_girls(grade)['girls']: + max_girls = number_of_boys_and_girls(grade)['girls'] + class_max_girls = grade['class'] + +print(f'Больше всего мальчиков в классе: {class_max_boys}\nБольше всего девочек в классе: {class_max_girls}') \ No newline at end of file diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index f4fb2fa2..ec640444 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -33,7 +33,6 @@ import random import uuid import datetime - import lorem @@ -55,67 +54,56 @@ def generate_chat_history(): return messages -def user_messages(messages): # 'id пользователя: список с id всех его сообщений +def user_messages(messages): user_messages = {} - for _ in messages: - sender_id = _['sent_by'] - message_id = _['id'] + for message in messages: + sender_id = message['sent_by'] + message_id = message['id'] - if user_messages.get(sender_id) == None: + if user_messages.get(sender_id) is None: user_messages[sender_id] = [message_id] else: user_messages[sender_id].append(message_id) - return user_messages # 'id пользователя: список с id всех его сообщений -def first_issue(user_messages): - wrote_the_most = max(user_messages.values(), key=len) - for _ in user_messages: - if user_messages[_] == wrote_the_most: - wrote_the_most = _ - return wrote_the_most + return user_messages # id пользователя: id всех сообщеня +def who_wrote_the_most_posts(user_messages): + maximum_number_of_messages = max(user_messages.values(), key=len) + for user_id in user_messages: + if user_messages[user_id] == maximum_number_of_messages: + return user_id -def number_answers(messages): +def number_of_responses_per_message(messages): number_answers = {} - for _ in messages: - if _['reply_for'] != None and _['reply_for'] != []: - if _['reply_for'] in number_answers: - number_answers[_['reply_for']] += 1 - else: - number_answers[_['reply_for']] = 1 + for message in messages: + if message['reply_for'] is not None and message['reply_for']: + number_answers[message['reply_for']] = number_answers.get(message['reply_for'], 0) + 1 return number_answers -def second_issue(number_answers): +def got_the_most_responses(number_answers): number_responses_per_user = {} - for _ in chat_history: - message_id = _['id'] - for i in number_answers: - if i == message_id: - if number_responses_per_user.get(_['sent_by']) == None: - number_responses_per_user[_['sent_by']] = number_answers[i] - else: - number_responses_per_user[_['sent_by']] += number_answers[i] + for message in chat_history: + for message_id in number_answers: + if message_id == message['id']: + number_responses_per_user[message['sent_by']] = number_responses_per_user.get(message['sent_by'], 0) + 1 most_cited = max(number_responses_per_user.values()) - for _ in number_responses_per_user: - if number_responses_per_user[_] == most_cited: - most_cited = _ - return most_cited + for uder_id in number_responses_per_user: + if number_responses_per_user[uder_id] == most_cited: + return uder_id def how_many_views(user_messages): how_many_views = {} - reply = [] - for _ in user_messages: + for user_id in user_messages: who_saw = [] - message_list = user_messages[_] - for i in message_list: - for j in chat_history: - if j['id'] == i: - who_saw += j['seen_by'] - how_many_views[_] = len(who_saw) + message_list = user_messages[user_id] + for user_message in message_list: + for message in chat_history: + if message['id'] == user_messages: + who_saw += message['seen_by'] + how_many_views[user_id] = len(who_saw) most_viewed = max(how_many_views.values()) - for _ in how_many_views: - if how_many_views[_] == most_viewed: - reply.append(_) - return reply + for user_id in how_many_views: + if how_many_views[user_id] == most_viewed: + return user_id def sending_time(messages): @@ -136,30 +124,29 @@ def sending_time(messages): else: sending_time['night'] += 1 busiest_time = max(sending_time.values()) - for _ in sending_time: - if sending_time[_] == busiest_time: - return _ + for time in sending_time: + if sending_time[time] == busiest_time: + return time def is_there_answer(id): - for _ in chat_history: - if _['reply_for'] == id: + for message in chat_history: + if message['reply_for'] == id: return True return False def reply_for_from_id(id): - for _ in chat_history: - if _['id'] == id: - return _['reply_for'] + for message in chat_history: + if message['id'] == id: + return message['reply_for'] def message_threads(messages): message_threads = {} - reply = [] - for _ in messages: - answer = is_there_answer(_['id']) + for message in messages: + answer = is_there_answer(message['id']) count = 0 - by = _['id'] - beginning = _['reply_for'] + by = message['id'] + beginning = message['reply_for'] if answer == False: - while beginning != None and beginning != []: + while beginning is not None and beginning: by = beginning beginning = reply_for_from_id(beginning) count += 1 @@ -168,23 +155,20 @@ def message_threads(messages): max_branch_length = max(message_threads.values()) - for _ in message_threads: - if message_threads[_] == max_branch_length: - reply.append(_) - return reply + for message_id in message_threads: + if message_threads[message_id] == max_branch_length: + return message_id if __name__ == "__main__": chat_history = generate_chat_history() - print(f'ID пользователя, который написал больше всех сообщений: {first_issue(user_messages(chat_history))}', end='\n\n') + print(f'ID пользователя, который написал больше всех сообщений: {who_wrote_the_most_posts(user_messages(chat_history))}', end='\n\n') #1 - print(f'ID пользователя, на которого больше всего отвечали: {second_issue(number_answers(chat_history))}', end='\n\n') #2 + print(f'ID пользователя, на которого больше всего отвечали: {got_the_most_responses(number_of_responses_per_message(chat_history))}', end='\n\n') #2 - print('ID пользователя с наибольшим кол-ом просмотров:', end=' ') #3 - print(*how_many_views(user_messages(chat_history)), end='\n\n') + print(f'ID пользователя с наибольшим кол-ом просмотров: {how_many_views(user_messages(chat_history))}', end='\n\n') #3 print(f'Больше всего сообщений: {sending_time(chat_history)}', end='\n\n') #4 - print('Начало для самых длинных тредов:', end='\n') #5 - print(*message_threads(chat_history), sep='\n') \ No newline at end of file + print(f'Начало для самых длинных тредов: {message_threads(chat_history)}') #5 \ No newline at end of file