From 7eabf14454c97dba17cf243921f35757eb3942c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sat, 13 May 2023 15:47:22 +0300 Subject: [PATCH 01/14] Test commit --- for_challenges.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/for_challenges.py b/for_challenges.py index 997754da..bb381b1c 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -2,7 +2,7 @@ # Необходимо вывести имена всех учеников из списка с новой строки names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? +print(*names, sep='\n') # Задание 2 From f3d43f8f675459103ae0c19689c5b63b3d79cb10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sat, 13 May 2023 20:38:40 +0300 Subject: [PATCH 02/14] for_challenges done --- for_challenges.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index bb381b1c..2697da79 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -4,7 +4,6 @@ names = ['Оля', 'Петя', 'Вася', 'Маша'] print(*names, sep='\n') - # Задание 2 # Необходимо вывести имена всех учеников из списка, рядом с именем показать количество букв в нём # Пример вывода: @@ -12,8 +11,8 @@ # Петя: 4 names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? - +for i in names: + print(f'{i}: {len(i)}') # Задание 3 # Необходимо вывести имена всех учеников из списка, рядом с именем вывести пол ученика @@ -25,8 +24,8 @@ 'Маша': False, } names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? - +for i in names: + print(f'{i}: {"мужской" if is_male[i] else "женский"}') # Задание 4 # Даны группу учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней @@ -40,8 +39,21 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ['Оля', 'Петя', 'Гриша'], ] -# ??? +group_token = lambda group_to: ( + (group_to in range(5, 20)) and 'групп' or + (1 in (group_to, (diglast := group_to % 10))) and 'группа' or + ({group_to, diglast} & {2, 3, 4}) and 'группы' or 'групп') + +student_token = lambda student_to: ( + (student_to in range(5, 20)) and 'учеников' or + (1 in (student_to, (diglast := student_to % 10))) and 'ученик' or + ({student_to, diglast} & {2, 3, 4}) and 'ученика' or 'учеников') + +print(f'Всего {len(groups)} {group_token(len(groups))}.') + +for key, value in dict(enumerate(groups, start=1)).items(): + print(f'Группа {key}: {len(value)} {student_token(len(value))}.') # Задание 5 # Для каждой пары учеников нужно с новой строки перечислить учеников, которые в неё входят @@ -54,4 +66,6 @@ ['Оля', 'Петя', 'Гриша'], ['Вася', 'Маша', 'Саша', 'Женя'], ] -# ??? \ No newline at end of file + +for key, value in dict(enumerate(groups, start=1)).items(): + print(f'Группа {key}:', ", ".join(value)) From a3d77c97c3adf21404ca74951e76df03d363e86e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sat, 13 May 2023 21:29:40 +0300 Subject: [PATCH 03/14] string_challenges done --- string_challenges.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/string_challenges.py b/string_challenges.py index 856add2d..105288da 100644 --- a/string_challenges.py +++ b/string_challenges.py @@ -1,28 +1,25 @@ # Вывести последнюю букву в слове word = 'Архангельск' -# ??? - +print(word[-1]) # Вывести количество букв "а" в слове word = 'Архангельск' -# ??? - +print(word.lower().count('а')) # Вывести количество гласных букв в слове word = 'Архангельск' -# ??? - +vowels = 'аеиоуэюяыё' +print(len([i for i in word.lower() if i in vowels])) # Вывести количество слов в предложении sentence = 'Мы приехали в гости' -# ??? - +print(len(sentence.split())) # Вывести первую букву каждого слова на отдельной строке sentence = 'Мы приехали в гости' -# ??? - +for i in sentence.split(): + print(i[0]) # Вывести усреднённую длину слова в предложении sentence = 'Мы приехали в гости' -# ??? \ No newline at end of file +print(int(sum([len(i) for i in sentence.split()]) / len(sentence.split()))) From 19e2ef38ffcb597718fd464a941294835368d9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sun, 14 May 2023 12:42:49 +0300 Subject: [PATCH 04/14] for_dict_challenges done --- for_dict_challenges.py | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 96062ebc..85b1d609 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -1,3 +1,6 @@ +import pandas as pd +from collections import Counter + # Задание 1 # Дан список учеников, нужно посчитать количество повторений каждого имени ученика # Пример вывода: @@ -12,8 +15,12 @@ {'first_name': 'Маша'}, {'first_name': 'Петя'}, ] -# ??? +names = [] +for i in students: + names.append(i['first_name']) +for key, value in Counter(names).items(): + print(f'{key}: {value}') # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя @@ -26,8 +33,12 @@ {'first_name': 'Маша'}, {'first_name': 'Оля'}, ] -# ??? +names = [] +for i in students: + names.append(i['first_name']) +# print(pd.DataFrame(names).mode()[0][0]) +print(f'Самое частое имя среди учеников: {max(names, key=lambda x: names.count(x))}') # Задание 3 # Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. @@ -44,15 +55,16 @@ {'first_name': 'Маша'}, {'first_name': 'Маша'}, {'first_name': 'Оля'}, - ],[ # это – третий класс + ], [ # это – третий класс {'first_name': 'Женя'}, {'first_name': 'Петя'}, {'first_name': 'Женя'}, {'first_name': 'Саша'}, ], ] -# ??? - +for key, value in dict(enumerate(school_students, start=1)).items(): + print(f'Самое частое имя в классе {key}: ' + f'{(lambda x: max([x["first_name"] for x in value], key=lambda y: x.count(y)))(value)}') # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. @@ -72,8 +84,10 @@ 'Миша': True, 'Даша': False, } -# ??? - +for i in school: + print(f'Класс {i["class"]}: девочки ' + f'{(lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(False)}, мальчики ' + f'{(lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(True)}') # Задание 5 # По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков @@ -91,5 +105,13 @@ 'Олег': True, 'Миша': True, } -# ??? +girls_boys = [] +for i in school: + girls_boys.append({ + 'class': i['class'], + 'girls': (lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(False), + 'boys': (lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(True) + }) +print(f"Больше всего мальчиков в классе {max(girls_boys, key=lambda x: x['boys'])['class']}") +print(f"Больше всего девочек в классе {max(girls_boys, key=lambda x: x['girls'])['class']}") From eb457dbea66ea6c486f75960c8e009aa7f7eae23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Wed, 17 May 2023 21:25:25 +0300 Subject: [PATCH 05/14] for_dict_challenges_bonus done --- for_dict_challenges_bonus.py | 73 +++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 9f35a0a0..c893ff26 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -1,3 +1,6 @@ +from collections import Counter +from itertools import groupby + """ Пожалуйста, приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам в этом репозитории. Она значительно сложнее. @@ -37,6 +40,7 @@ import lorem + def generate_chat_history(): messages_amount = random.randint(200, 1000) users_ids = list( @@ -66,5 +70,72 @@ def generate_chat_history(): return messages +def task1(messages): + users_list = [message['sent_by'] for message in messages] + return f'{max(users_list, key=lambda x: users_list.count(x))} - ' \ + f'айди пользователя, который написал больше всех сообщений' + + +def task2(messages): + answers_list = [message['reply_for'] for message in messages if message['reply_for'] is not None] + for i in messages: + if i['id'] == max(answers_list, key=lambda x: answers_list.count(x)): + return f'{i["sent_by"]} - айди пользователя, на сообщения которого больше всего отвечали' + + +def task3(messages): + id_unique = {} + for i in messages: + if i['sent_by'] not in id_unique: + id_unique[i['sent_by']] = i['seen_by'] + else: + id_unique[i['sent_by']] = id_unique[i['sent_by']] + i['seen_by'] + + for key, value in id_unique.items(): + print(f'Сообщения от пользователя под айди {key}, видело {len(set(value))} уникальных пользователей') + + +def task4(messages): + d = { + 'утром (до 12 часов)': [], + 'днём (12-18 часов)': [], + 'вечером (после 18 часов)': [] + } + + for i in messages: + if float(i["sent_at"].strftime('%H.%M')) < 12: + d['утром (до 12 часов)'].append(float(i["sent_at"].strftime('%H.%M'))) + elif 18 > float(i["sent_at"].strftime('%H.%M')) > 12: + d['днём (12-18 часов)'].append(float(i["sent_at"].strftime('%H.%M'))) + else: + d['вечером (после 18 часов)'].append(float(i["sent_at"].strftime('%H.%M'))) + + return f'В чате больше всего сообщений: {max(d, key=lambda x: len(d[x]))}' + +def task5(messages): + result = [] + + for k, g in groupby([i['reply_for'] for i in messages]): + length = len(list(g)) + result.append((k, length)) + + lst = [(key, value) for key, value in sorted(result, key=lambda x: x[1], reverse=True) if + key is not None and value > 1] + + if len(lst) > 0: + for key, value in lst: + print(f'Сообщение под айди: "{key}" стало началом для самых длинных тредов (цепочек ответов), а именно ' + f'{value}.') + else: + print('Максимальная длина тредов (цепочек ответов) составляет 1.') + if __name__ == "__main__": - print(generate_chat_history()) + print(task1(generate_chat_history())) + print('_' * 75) + print(task2(generate_chat_history())) + print('_' * 75) + task3(generate_chat_history()) + print('_' * 75) + print(task4(generate_chat_history())) + print('_' * 75) + task5(generate_chat_history()) From 340e25e7fe0d8b889fb2592db33e52b5d9fc7afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Thu, 18 May 2023 19:56:42 +0300 Subject: [PATCH 06/14] Done --- for_challenges.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index 2697da79..1367a069 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -11,8 +11,8 @@ # Петя: 4 names = ['Оля', 'Петя', 'Вася', 'Маша'] -for i in names: - print(f'{i}: {len(i)}') +for name in names: + print(f'{name}: {len(name)}') # Задание 3 # Необходимо вывести имена всех учеников из списка, рядом с именем вывести пол ученика @@ -24,8 +24,8 @@ 'Маша': False, } names = ['Оля', 'Петя', 'Вася', 'Маша'] -for i in names: - print(f'{i}: {"мужской" if is_male[i] else "женский"}') +for name in names: + print(f'{name}: {"мужской" if is_male[name] else "женский"}') # Задание 4 # Даны группу учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней From 24a75a7b06b52183329921df0fd6f6d697d255d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Thu, 18 May 2023 19:56:53 +0300 Subject: [PATCH 07/14] Done --- for_dict_challenges.py | 35 ++++++++++++++++++------------ for_dict_challenges_bonus.py | 42 ++++++++++++++++++------------------ string_challenges.py | 8 +++---- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 85b1d609..b6af95f4 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -16,8 +16,8 @@ {'first_name': 'Петя'}, ] names = [] -for i in students: - names.append(i['first_name']) +for student in students: + names.append(student['first_name']) for key, value in Counter(names).items(): print(f'{key}: {value}') @@ -34,12 +34,16 @@ {'first_name': 'Оля'}, ] names = [] -for i in students: - names.append(i['first_name']) +for student in students: + names.append(student['first_name']) + +print('_' * 75) # print(pd.DataFrame(names).mode()[0][0]) print(f'Самое частое имя среди учеников: {max(names, key=lambda x: names.count(x))}') +print('_' * 75) + # Задание 3 # Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. # Пример вывода: @@ -66,6 +70,7 @@ print(f'Самое частое имя в классе {key}: ' f'{(lambda x: max([x["first_name"] for x in value], key=lambda y: x.count(y)))(value)}') +print('_' * 75) # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: @@ -84,10 +89,12 @@ 'Миша': True, 'Даша': False, } -for i in school: - print(f'Класс {i["class"]}: девочки ' - f'{(lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(False)}, мальчики ' - f'{(lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(True)}') +for group in school: + print(f'Класс {group["class"]}: девочки ' + f'{(lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(False)}, мальчики ' + f'{(lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(True)}') + +print('_' * 75) # Задание 5 # По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков @@ -106,12 +113,12 @@ 'Миша': True, } girls_boys = [] -for i in school: +for group in school: girls_boys.append({ - 'class': i['class'], - 'girls': (lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(False), - 'boys': (lambda x: [is_male[x["first_name"]] for x in i["students"]])(i).count(True) + 'class': group['class'], + 'girls': (lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(False), + 'boys': (lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(True) }) -print(f"Больше всего мальчиков в классе {max(girls_boys, key=lambda x: x['boys'])['class']}") -print(f"Больше всего девочек в классе {max(girls_boys, key=lambda x: x['girls'])['class']}") +print(f"Больше всего мальчиков в классе: {max(girls_boys, key=lambda x: x['boys'])['class']}") +print(f"Больше всего девочек в классе: {max(girls_boys, key=lambda x: x['girls'])['class']}") diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index c893ff26..8b53804a 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -1,6 +1,11 @@ +import random +import uuid +import datetime +import lorem from collections import Counter from itertools import groupby + """ Пожалуйста, приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам в этом репозитории. Она значительно сложнее. @@ -33,11 +38,6 @@ Весь код стоит разбить на логические части с помощью функций. """ -import random -import uuid -import datetime - -import lorem @@ -78,44 +78,44 @@ def task1(messages): def task2(messages): answers_list = [message['reply_for'] for message in messages if message['reply_for'] is not None] - for i in messages: - if i['id'] == max(answers_list, key=lambda x: answers_list.count(x)): - return f'{i["sent_by"]} - айди пользователя, на сообщения которого больше всего отвечали' + for message in messages: + if message['id'] == max(answers_list, key=lambda x: answers_list.count(x)): + return f'{message["sent_by"]} - айди пользователя, на сообщения которого больше всего отвечали' def task3(messages): id_unique = {} - for i in messages: - if i['sent_by'] not in id_unique: - id_unique[i['sent_by']] = i['seen_by'] + for message in messages: + if message['sent_by'] not in id_unique: + id_unique[message['sent_by']] = message['seen_by'] else: - id_unique[i['sent_by']] = id_unique[i['sent_by']] + i['seen_by'] + id_unique[message['sent_by']] = id_unique[message['sent_by']] + message['seen_by'] for key, value in id_unique.items(): print(f'Сообщения от пользователя под айди {key}, видело {len(set(value))} уникальных пользователей') def task4(messages): - d = { + times = { 'утром (до 12 часов)': [], 'днём (12-18 часов)': [], 'вечером (после 18 часов)': [] } - for i in messages: - if float(i["sent_at"].strftime('%H.%M')) < 12: - d['утром (до 12 часов)'].append(float(i["sent_at"].strftime('%H.%M'))) - elif 18 > float(i["sent_at"].strftime('%H.%M')) > 12: - d['днём (12-18 часов)'].append(float(i["sent_at"].strftime('%H.%M'))) + for message in messages: + if float(message["sent_at"].strftime('%H.%M')) < 12: + times['утром (до 12 часов)'].append(float(message["sent_at"].strftime('%H.%M'))) + elif 18 > float(message["sent_at"].strftime('%H.%M')) > 12: + times['днём (12-18 часов)'].append(float(message["sent_at"].strftime('%H.%M'))) else: - d['вечером (после 18 часов)'].append(float(i["sent_at"].strftime('%H.%M'))) + times['вечером (после 18 часов)'].append(float(message["sent_at"].strftime('%H.%M'))) - return f'В чате больше всего сообщений: {max(d, key=lambda x: len(d[x]))}' + return f'В чате больше всего сообщений: {max(times, key=lambda x: len(times[x]))}' def task5(messages): result = [] - for k, g in groupby([i['reply_for'] for i in messages]): + for k, g in groupby([message['reply_for'] for message in messages]): length = len(list(g)) result.append((k, length)) diff --git a/string_challenges.py b/string_challenges.py index 105288da..681f9355 100644 --- a/string_challenges.py +++ b/string_challenges.py @@ -9,7 +9,7 @@ # Вывести количество гласных букв в слове word = 'Архангельск' vowels = 'аеиоуэюяыё' -print(len([i for i in word.lower() if i in vowels])) +print(len([letter for letter in word.lower() if letter in vowels])) # Вывести количество слов в предложении sentence = 'Мы приехали в гости' @@ -17,9 +17,9 @@ # Вывести первую букву каждого слова на отдельной строке sentence = 'Мы приехали в гости' -for i in sentence.split(): - print(i[0]) +for word in sentence.split(): + print(word[0]) # Вывести усреднённую длину слова в предложении sentence = 'Мы приехали в гости' -print(int(sum([len(i) for i in sentence.split()]) / len(sentence.split()))) +print(int(sum([len(word) for word in sentence.split()]) / len(sentence.split()))) From 29014c50fa833cefc75041121f332607af8e1ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sat, 20 May 2023 21:24:00 +0300 Subject: [PATCH 08/14] Done --- for_challenges.py | 34 ++++++++------ for_dict_challenges.py | 65 +++++++++++++++------------ for_dict_challenges_bonus.py | 87 +++++++++++++++++++----------------- 3 files changed, 103 insertions(+), 83 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index 1367a069..af839ad0 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -40,20 +40,28 @@ ['Оля', 'Петя', 'Гриша'], ] -group_token = lambda group_to: ( - (group_to in range(5, 20)) and 'групп' or - (1 in (group_to, (diglast := group_to % 10))) and 'группа' or - ({group_to, diglast} & {2, 3, 4}) and 'группы' or 'групп') +def singular_and_plural_noun_group(numb): + if numb in range(5, 20): + return 'групп' + elif 1 in (numb, (diglast := numb % 10)): + return 'группа' + elif {numb, diglast} & {2, 3, 4}: + return 'группы' + return 'групп' -student_token = lambda student_to: ( - (student_to in range(5, 20)) and 'учеников' or - (1 in (student_to, (diglast := student_to % 10))) and 'ученик' or - ({student_to, diglast} & {2, 3, 4}) and 'ученика' or 'учеников') +def singular_and_plural_noun_student(numb): + if numb in range(5, 20): + return 'учеников' + elif 1 in (numb, (diglast := numb % 10)): + return 'ученик' + elif {numb, diglast} & {2, 3, 4}: + return 'ученика' + return 'учеников' -print(f'Всего {len(groups)} {group_token(len(groups))}.') +print(f'Всего {len(groups)} {singular_and_plural_noun_group(len(groups))}.') -for key, value in dict(enumerate(groups, start=1)).items(): - print(f'Группа {key}: {len(value)} {student_token(len(value))}.') +for group_number, group in enumerate(groups, start=1): + print(f'Группа {group_number}: {len(group)} {singular_and_plural_noun_student(len(group))}.') # Задание 5 # Для каждой пары учеников нужно с новой строки перечислить учеников, которые в неё входят @@ -67,5 +75,5 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ] -for key, value in dict(enumerate(groups, start=1)).items(): - print(f'Группа {key}:', ", ".join(value)) +for group_number, group in enumerate(groups, start=1): + print(f'Группа {group_number}: {", ".join(group)}') diff --git a/for_dict_challenges.py b/for_dict_challenges.py index b6af95f4..71d36508 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -1,6 +1,6 @@ -import pandas as pd from collections import Counter + # Задание 1 # Дан список учеников, нужно посчитать количество повторений каждого имени ученика # Пример вывода: @@ -8,6 +8,11 @@ # Маша: 2 # Петя: 2 +# создадим функцию, которая возвращает список студентов по ключу 'first_name' +def student_list(lst): + return [student['first_name'] for student in lst] + + students = [ {'first_name': 'Вася'}, {'first_name': 'Петя'}, @@ -15,12 +20,11 @@ {'first_name': 'Маша'}, {'first_name': 'Петя'}, ] -names = [] -for student in students: - names.append(student['first_name']) -for key, value in Counter(names).items(): - print(f'{key}: {value}') +for name, count_students in Counter(student_list(students)).items(): + print(f'{name}: {count_students}') + +print('_' * 75) # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя @@ -33,14 +37,15 @@ {'first_name': 'Маша'}, {'first_name': 'Оля'}, ] -names = [] -for student in students: - names.append(student['first_name']) -print('_' * 75) -# print(pd.DataFrame(names).mode()[0][0]) -print(f'Самое частое имя среди учеников: {max(names, key=lambda x: names.count(x))}') +# Создадим функцию, которая принимает list для нахождения максимального повторяющегося элемента в данном списке + +def maximum_frequency(lst): + return Counter(lst).most_common(1)[0][0] + + +print(f'Самое частое имя среди учеников: {maximum_frequency(student_list(students))}') print('_' * 75) @@ -66,15 +71,16 @@ {'first_name': 'Саша'}, ], ] -for key, value in dict(enumerate(school_students, start=1)).items(): - print(f'Самое частое имя в классе {key}: ' - f'{(lambda x: max([x["first_name"] for x in value], key=lambda y: x.count(y)))(value)}') + +for class_number, students in enumerate(school_students, start=1): + print(f'Самое частое имя в классе {class_number}: {maximum_frequency(student_list(students))}') print('_' * 75) + # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: -# Класс 2a: девочки 2, мальчики 0 +# Класс 2a: девочки 2, мальчики 0 # Класс 2б: девочки 0, мальчики 2 school = [ @@ -89,10 +95,18 @@ 'Миша': True, 'Даша': False, } + + +def find_girls(): + return [is_male[girls["first_name"]] for girls in group["students"]].count(False) + + +def find_boys(): + return [is_male[boys["first_name"]] for boys in group["students"]].count(True) + + for group in school: - print(f'Класс {group["class"]}: девочки ' - f'{(lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(False)}, мальчики ' - f'{(lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(True)}') + print(f'Класс {group["class"]}: девочки {find_girls()}, мальчики {find_boys()}') print('_' * 75) @@ -112,13 +126,8 @@ 'Олег': True, 'Миша': True, } -girls_boys = [] for group in school: - girls_boys.append({ - 'class': group['class'], - 'girls': (lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(False), - 'boys': (lambda x: [is_male[x["first_name"]] for x in group["students"]])(group).count(True) - }) - -print(f"Больше всего мальчиков в классе: {max(girls_boys, key=lambda x: x['boys'])['class']}") -print(f"Больше всего девочек в классе: {max(girls_boys, key=lambda x: x['girls'])['class']}") + if find_boys() > find_girls(): + print(f'Больше всего мальчиков в классе: {group["class"]}') + else: + print(f'Больше всего девочек в классе: {group["class"]}') diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 8b53804a..389737c3 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -2,9 +2,8 @@ import uuid import datetime import lorem -from collections import Counter from itertools import groupby - +from collections import Counter """ Пожалуйста, приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам @@ -40,6 +39,10 @@ """ +# Создадим функцию, которая принимает list для нахождения максимального повторяющегося элемента в данном списке +def maximum_frequency(lst): + return Counter(lst).most_common(1)[0][0] + def generate_chat_history(): messages_amount = random.randint(200, 1000) @@ -70,72 +73,72 @@ def generate_chat_history(): return messages -def task1(messages): - users_list = [message['sent_by'] for message in messages] - return f'{max(users_list, key=lambda x: users_list.count(x))} - ' \ - f'айди пользователя, который написал больше всех сообщений' +# Создает список значений по ключу +def create_list_by_key(key_name: str, messages): + return [message[key_name] for message in messages if message[key_name] is not None] -def task2(messages): - answers_list = [message['reply_for'] for message in messages if message['reply_for'] is not None] +def find_id_who_write_the_most_messages(messages): + return maximum_frequency(create_list_by_key('sent_by', messages)) + + +def find_id_who_got_the_most_replies(messages): for message in messages: - if message['id'] == max(answers_list, key=lambda x: answers_list.count(x)): - return f'{message["sent_by"]} - айди пользователя, на сообщения которого больше всего отвечали' + if message['id'] == maximum_frequency(create_list_by_key('reply_for', messages)): + return message["sent_by"] -def task3(messages): +def find_id_saw_unique_users(messages): id_unique = {} for message in messages: if message['sent_by'] not in id_unique: - id_unique[message['sent_by']] = message['seen_by'] + id_unique[message['sent_by']] = set(message['seen_by']) else: - id_unique[message['sent_by']] = id_unique[message['sent_by']] + message['seen_by'] + id_unique[message['sent_by']] = set(id_unique[message['sent_by']]) | set(message['seen_by']) - for key, value in id_unique.items(): - print(f'Сообщения от пользователя под айди {key}, видело {len(set(value))} уникальных пользователей') + # создаем переменную с отсортированными айди по убыванию кол-ва просмотров уникальными пользователями + sorted_id_user_and_count_saw_users = sorted(id_unique.items(), reverse=True, key=lambda x: len(x[1])) + return [id_user for id_user, count in sorted_id_user_and_count_saw_users] -def task4(messages): +def what_time_more_messages(messages): times = { - 'утром (до 12 часов)': [], - 'днём (12-18 часов)': [], - 'вечером (после 18 часов)': [] + 'morning': [], + 'day': [], + 'evening': [] } for message in messages: - if float(message["sent_at"].strftime('%H.%M')) < 12: - times['утром (до 12 часов)'].append(float(message["sent_at"].strftime('%H.%M'))) - elif 18 > float(message["sent_at"].strftime('%H.%M')) > 12: - times['днём (12-18 часов)'].append(float(message["sent_at"].strftime('%H.%M'))) + hour_of_writing = message["sent_at"].hour + if hour_of_writing < 12: + times['morning'].append(hour_of_writing) + elif 18 > hour_of_writing > 12: + times['day'].append(hour_of_writing) else: - times['вечером (после 18 часов)'].append(float(message["sent_at"].strftime('%H.%M'))) + times['evening'].append(hour_of_writing) + + return max(times.items(), key=lambda x: len(x[1]))[0] - return f'В чате больше всего сообщений: {max(times, key=lambda x: len(times[x]))}' -def task5(messages): +def maximum_thread_length(messages): result = [] - for k, g in groupby([message['reply_for'] for message in messages]): - length = len(list(g)) - result.append((k, length)) + for id_reply_for, thread_length in groupby( + [message['reply_for'] for message in messages if message['reply_for'] is not None]): + length = len(list(thread_length)) + if length > 1: + result.append(id_reply_for) - lst = [(key, value) for key, value in sorted(result, key=lambda x: x[1], reverse=True) if - key is not None and value > 1] + return result - if len(lst) > 0: - for key, value in lst: - print(f'Сообщение под айди: "{key}" стало началом для самых длинных тредов (цепочек ответов), а именно ' - f'{value}.') - else: - print('Максимальная длина тредов (цепочек ответов) составляет 1.') if __name__ == "__main__": - print(task1(generate_chat_history())) + print(find_id_who_write_the_most_messages(generate_chat_history())) print('_' * 75) - print(task2(generate_chat_history())) + print(find_id_who_got_the_most_replies(generate_chat_history())) print('_' * 75) - task3(generate_chat_history()) + print(find_id_saw_unique_users(generate_chat_history())) print('_' * 75) - print(task4(generate_chat_history())) + print(what_time_more_messages(generate_chat_history())) print('_' * 75) - task5(generate_chat_history()) + print(maximum_thread_length(generate_chat_history())) From 5e8c03bdac8a0f3aee1389a6b2d2ea47b1c3b9a4 Mon Sep 17 00:00:00 2001 From: Almaz <120163489+badrievad@users.noreply.github.com> Date: Sat, 20 May 2023 21:25:53 +0300 Subject: [PATCH 09/14] Update for_dict_challenges.py --- for_dict_challenges.py | 1 - 1 file changed, 1 deletion(-) diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 71d36508..a34f5ac1 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -40,7 +40,6 @@ def student_list(lst): # Создадим функцию, которая принимает list для нахождения максимального повторяющегося элемента в данном списке - def maximum_frequency(lst): return Counter(lst).most_common(1)[0][0] From ec1b21b4f3a26e69d897254d2da8be87def57d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B0=D0=B4=D1=80=D0=B8=D0=B5=D0=B2=D0=90?= Date: Wed, 24 May 2023 14:36:57 +0300 Subject: [PATCH 10/14] Done --- for_dict_challenges.py | 43 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/for_dict_challenges.py b/for_dict_challenges.py index a34f5ac1..52e960b0 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -9,8 +9,8 @@ # Петя: 2 # создадим функцию, которая возвращает список студентов по ключу 'first_name' -def student_list(lst): - return [student['first_name'] for student in lst] +def get_students_first_names(student_list): + return [student['first_name'] for student in student_list] students = [ @@ -21,7 +21,7 @@ def student_list(lst): {'first_name': 'Петя'}, ] -for name, count_students in Counter(student_list(students)).items(): +for name, count_students in Counter(get_students_first_names(students)).items(): print(f'{name}: {count_students}') print('_' * 75) @@ -44,7 +44,7 @@ def maximum_frequency(lst): return Counter(lst).most_common(1)[0][0] -print(f'Самое частое имя среди учеников: {maximum_frequency(student_list(students))}') +print(f'Самое частое имя среди учеников: {maximum_frequency(get_students_first_names(students))}') print('_' * 75) @@ -72,16 +72,25 @@ def maximum_frequency(lst): ] for class_number, students in enumerate(school_students, start=1): - print(f'Самое частое имя в классе {class_number}: {maximum_frequency(student_list(students))}') + print(f'Самое частое имя в классе {class_number}: {maximum_frequency(get_students_first_names(students))}') print('_' * 75) + # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: # Класс 2a: девочки 2, мальчики 0 # Класс 2б: девочки 0, мальчики 2 +def find_count_girls(): + return [is_male[girls["first_name"]] for girls in group["students"]].count(False) + + +def find_count_boys(): + return [is_male[boys["first_name"]] for boys in group["students"]].count(True) + + school = [ {'class': '2a', 'students': [{'first_name': 'Маша'}, {'first_name': 'Оля'}]}, {'class': '2б', 'students': [{'first_name': 'Олег'}, {'first_name': 'Миша'}]}, @@ -95,17 +104,8 @@ def maximum_frequency(lst): 'Даша': False, } - -def find_girls(): - return [is_male[girls["first_name"]] for girls in group["students"]].count(False) - - -def find_boys(): - return [is_male[boys["first_name"]] for boys in group["students"]].count(True) - - for group in school: - print(f'Класс {group["class"]}: девочки {find_girls()}, мальчики {find_boys()}') + print(f'Класс {group["class"]}: девочки {find_count_girls()}, мальчики {find_count_boys()}') print('_' * 75) @@ -125,8 +125,13 @@ def find_boys(): 'Олег': True, 'Миша': True, } + +list_with_classes_and_boys = [] +list_with_classes_and_girls = [] + for group in school: - if find_boys() > find_girls(): - print(f'Больше всего мальчиков в классе: {group["class"]}') - else: - print(f'Больше всего девочек в классе: {group["class"]}') + list_with_classes_and_girls.append((group["class"], find_count_girls())) + list_with_classes_and_boys.append((group["class"], find_count_boys())) + +print(f"Больше всего девочек в классе {max(list_with_classes_and_girls, key=lambda x: x[1])[0]}") +print(f"Больше всего мальчиков в классе {max(list_with_classes_and_boys, key=lambda x: x[1])[0]}") From c115653d87999a971c3aea3305e676dc73dc4096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Wed, 24 May 2023 08:01:23 +0300 Subject: [PATCH 11/14] Done --- for_challenges.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index af839ad0..1466a287 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -40,7 +40,9 @@ ['Оля', 'Петя', 'Гриша'], ] -def singular_and_plural_noun_group(numb): + +# функция принимает число и изменяет существительное "группа" в зависимости от переданного аргумента +def singular_and_plural_noun_group(numb: int): if numb in range(5, 20): return 'групп' elif 1 in (numb, (diglast := numb % 10)): @@ -49,7 +51,9 @@ def singular_and_plural_noun_group(numb): return 'группы' return 'групп' -def singular_and_plural_noun_student(numb): + +# функция принимает число и изменяет существительное "ученик" в зависимости от переданного аргумента +def singular_and_plural_noun_student(numb: int): if numb in range(5, 20): return 'учеников' elif 1 in (numb, (diglast := numb % 10)): @@ -58,6 +62,7 @@ def singular_and_plural_noun_student(numb): return 'ученика' return 'учеников' + print(f'Всего {len(groups)} {singular_and_plural_noun_group(len(groups))}.') for group_number, group in enumerate(groups, start=1): From 2d839db7a59bdf1ef4322a3c7bf58cdbfa29f77e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sat, 27 May 2023 12:45:49 +0300 Subject: [PATCH 12/14] Done --- for_challenges.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/for_challenges.py b/for_challenges.py index 1466a287..0457a636 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -42,7 +42,7 @@ # функция принимает число и изменяет существительное "группа" в зависимости от переданного аргумента -def singular_and_plural_noun_group(numb: int): +def singular_and_plural_noun_group(numb): if numb in range(5, 20): return 'групп' elif 1 in (numb, (diglast := numb % 10)): @@ -53,7 +53,7 @@ def singular_and_plural_noun_group(numb: int): # функция принимает число и изменяет существительное "ученик" в зависимости от переданного аргумента -def singular_and_plural_noun_student(numb: int): +def singular_and_plural_noun_student(numb): if numb in range(5, 20): return 'учеников' elif 1 in (numb, (diglast := numb % 10)): From 84f10c7f09d1324dd90cb54a9a49fee3fa5f5e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sat, 27 May 2023 12:50:36 +0300 Subject: [PATCH 13/14] Done --- for_dict_challenges.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 52e960b0..897e7912 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -83,12 +83,12 @@ def maximum_frequency(lst): # Класс 2a: девочки 2, мальчики 0 # Класс 2б: девочки 0, мальчики 2 -def find_count_girls(): - return [is_male[girls["first_name"]] for girls in group["students"]].count(False) +def find_count_girls(students_group): + return [is_male[girls["first_name"]] for girls in students_group["students"]].count(False) -def find_count_boys(): - return [is_male[boys["first_name"]] for boys in group["students"]].count(True) +def find_count_boys(students_group): + return [is_male[boys["first_name"]] for boys in students_group["students"]].count(True) school = [ @@ -105,7 +105,7 @@ def find_count_boys(): } for group in school: - print(f'Класс {group["class"]}: девочки {find_count_girls()}, мальчики {find_count_boys()}') + print(f'Класс {group["class"]}: девочки {find_count_girls(group)}, мальчики {find_count_boys(group)}') print('_' * 75) @@ -130,8 +130,8 @@ def find_count_boys(): list_with_classes_and_girls = [] for group in school: - list_with_classes_and_girls.append((group["class"], find_count_girls())) - list_with_classes_and_boys.append((group["class"], find_count_boys())) + list_with_classes_and_girls.append((group["class"], find_count_girls(group))) + list_with_classes_and_boys.append((group["class"], find_count_boys(group))) print(f"Больше всего девочек в классе {max(list_with_classes_and_girls, key=lambda x: x[1])[0]}") print(f"Больше всего мальчиков в классе {max(list_with_classes_and_boys, key=lambda x: x[1])[0]}") From 3fcdf931b0a9ef412aaf92afbda68d0bfb4831e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=BC=D0=B0=D0=B7?= Date: Sat, 27 May 2023 12:55:02 +0300 Subject: [PATCH 14/14] Done --- for_dict_challenges_bonus.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 389737c3..c492d732 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -91,33 +91,33 @@ def find_id_who_got_the_most_replies(messages): def find_id_saw_unique_users(messages): id_unique = {} for message in messages: - if message['sent_by'] not in id_unique: - id_unique[message['sent_by']] = set(message['seen_by']) - else: - id_unique[message['sent_by']] = set(id_unique[message['sent_by']]) | set(message['seen_by']) + id_unique.setdefault(message['sent_by'], set()).update(message['seen_by']) - # создаем переменную с отсортированными айди по убыванию кол-ва просмотров уникальными пользователями + # создаем список с отсортированными айди по убыванию кол-ва просмотров уникальными пользователями sorted_id_user_and_count_saw_users = sorted(id_unique.items(), reverse=True, key=lambda x: len(x[1])) return [id_user for id_user, count in sorted_id_user_and_count_saw_users] def what_time_more_messages(messages): - times = { - 'morning': [], - 'day': [], - 'evening': [] - } + morning, day, evening = [], [], [] for message in messages: hour_of_writing = message["sent_at"].hour if hour_of_writing < 12: - times['morning'].append(hour_of_writing) + morning.append(hour_of_writing) elif 18 > hour_of_writing > 12: - times['day'].append(hour_of_writing) + day.append(hour_of_writing) else: - times['evening'].append(hour_of_writing) + evening.append(hour_of_writing) + + max_messages = max([len(message) for message in [morning, day, evening]]) - return max(times.items(), key=lambda x: len(x[1]))[0] + if len(morning) == max_messages: + return 'morning' + elif len(day) == max_messages: + return 'day' + else: + return 'evening' def maximum_thread_length(messages):