diff --git a/for_challenges.py b/for_challenges.py index 997754da..0457a636 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -2,8 +2,7 @@ # Необходимо вывести имена всех учеников из списка с новой строки names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? - +print(*names, sep='\n') # Задание 2 # Необходимо вывести имена всех учеников из списка, рядом с именем показать количество букв в нём @@ -12,8 +11,8 @@ # Петя: 4 names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? - +for name in names: + print(f'{name}: {len(name)}') # Задание 3 # Необходимо вывести имена всех учеников из списка, рядом с именем вывести пол ученика @@ -25,8 +24,8 @@ 'Маша': False, } names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? - +for name in names: + print(f'{name}: {"мужской" if is_male[name] else "женский"}') # Задание 4 # Даны группу учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней @@ -40,9 +39,35 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ['Оля', 'Петя', 'Гриша'], ] -# ??? +# функция принимает число и изменяет существительное "группа" в зависимости от переданного аргумента +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 'групп' + + +# функция принимает число и изменяет существительное "ученик" в зависимости от переданного аргумента +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)} {singular_and_plural_noun_group(len(groups))}.') + +for group_number, group in enumerate(groups, start=1): + print(f'Группа {group_number}: {len(group)} {singular_and_plural_noun_student(len(group))}.') + # Задание 5 # Для каждой пары учеников нужно с новой строки перечислить учеников, которые в неё входят # Пример вывода: @@ -54,4 +79,6 @@ ['Оля', 'Петя', 'Гриша'], ['Вася', 'Маша', 'Саша', 'Женя'], ] -# ??? \ No newline at end of file + +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 96062ebc..897e7912 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -1,3 +1,6 @@ +from collections import Counter + + # Задание 1 # Дан список учеников, нужно посчитать количество повторений каждого имени ученика # Пример вывода: @@ -5,6 +8,11 @@ # Маша: 2 # Петя: 2 +# создадим функцию, которая возвращает список студентов по ключу 'first_name' +def get_students_first_names(student_list): + return [student['first_name'] for student in student_list] + + students = [ {'first_name': 'Вася'}, {'first_name': 'Петя'}, @@ -12,8 +20,11 @@ {'first_name': 'Маша'}, {'first_name': 'Петя'}, ] -# ??? +for name, count_students in Counter(get_students_first_names(students)).items(): + print(f'{name}: {count_students}') + +print('_' * 75) # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя @@ -26,9 +37,17 @@ {'first_name': 'Маша'}, {'first_name': 'Оля'}, ] -# ??? +# Создадим функцию, которая принимает list для нахождения максимального повторяющегося элемента в данном списке +def maximum_frequency(lst): + return Counter(lst).most_common(1)[0][0] + + +print(f'Самое частое имя среди учеников: {maximum_frequency(get_students_first_names(students))}') + +print('_' * 75) + # Задание 3 # Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. # Пример вывода: @@ -44,22 +63,34 @@ {'first_name': 'Маша'}, {'first_name': 'Маша'}, {'first_name': 'Оля'}, - ],[ # это – третий класс + ], [ # это – третий класс {'first_name': 'Женя'}, {'first_name': 'Петя'}, {'first_name': 'Женя'}, {'first_name': 'Саша'}, ], ] -# ??? + +for class_number, students in enumerate(school_students, start=1): + print(f'Самое частое имя в классе {class_number}: {maximum_frequency(get_students_first_names(students))}') + +print('_' * 75) # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: -# Класс 2a: девочки 2, мальчики 0 +# Класс 2a: девочки 2, мальчики 0 # Класс 2б: девочки 0, мальчики 2 +def find_count_girls(students_group): + return [is_male[girls["first_name"]] for girls in students_group["students"]].count(False) + + +def find_count_boys(students_group): + return [is_male[boys["first_name"]] for boys in students_group["students"]].count(True) + + school = [ {'class': '2a', 'students': [{'first_name': 'Маша'}, {'first_name': 'Оля'}]}, {'class': '2б', 'students': [{'first_name': 'Олег'}, {'first_name': 'Миша'}]}, @@ -72,8 +103,11 @@ 'Миша': True, 'Даша': False, } -# ??? +for group in school: + print(f'Класс {group["class"]}: девочки {find_count_girls(group)}, мальчики {find_count_boys(group)}') + +print('_' * 75) # Задание 5 # По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков @@ -91,5 +125,13 @@ 'Олег': True, 'Миша': True, } -# ??? +list_with_classes_and_boys = [] +list_with_classes_and_girls = [] + +for group in school: + 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]}") diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 9f35a0a0..c492d732 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -1,3 +1,10 @@ +import random +import uuid +import datetime +import lorem +from itertools import groupby +from collections import Counter + """ Пожалуйста, приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам в этом репозитории. Она значительно сложнее. @@ -30,11 +37,11 @@ Весь код стоит разбить на логические части с помощью функций. """ -import random -import uuid -import datetime -import lorem + +# Создадим функцию, которая принимает list для нахождения максимального повторяющегося элемента в данном списке +def maximum_frequency(lst): + return Counter(lst).most_common(1)[0][0] def generate_chat_history(): @@ -66,5 +73,72 @@ def generate_chat_history(): return messages +# Создает список значений по ключу +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 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'] == maximum_frequency(create_list_by_key('reply_for', messages)): + return message["sent_by"] + + +def find_id_saw_unique_users(messages): + id_unique = {} + for message in messages: + 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): + morning, day, evening = [], [], [] + + for message in messages: + hour_of_writing = message["sent_at"].hour + if hour_of_writing < 12: + morning.append(hour_of_writing) + elif 18 > hour_of_writing > 12: + day.append(hour_of_writing) + else: + evening.append(hour_of_writing) + + max_messages = max([len(message) for message in [morning, day, evening]]) + + if len(morning) == max_messages: + return 'morning' + elif len(day) == max_messages: + return 'day' + else: + return 'evening' + + +def maximum_thread_length(messages): + result = [] + + 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) + + return result + + if __name__ == "__main__": - print(generate_chat_history()) + print(find_id_who_write_the_most_messages(generate_chat_history())) + print('_' * 75) + print(find_id_who_got_the_most_replies(generate_chat_history())) + print('_' * 75) + print(find_id_saw_unique_users(generate_chat_history())) + print('_' * 75) + print(what_time_more_messages(generate_chat_history())) + print('_' * 75) + print(maximum_thread_length(generate_chat_history())) diff --git a/string_challenges.py b/string_challenges.py index 856add2d..681f9355 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([letter for letter in word.lower() if letter in vowels])) # Вывести количество слов в предложении sentence = 'Мы приехали в гости' -# ??? - +print(len(sentence.split())) # Вывести первую букву каждого слова на отдельной строке sentence = 'Мы приехали в гости' -# ??? - +for word in sentence.split(): + print(word[0]) # Вывести усреднённую длину слова в предложении sentence = 'Мы приехали в гости' -# ??? \ No newline at end of file +print(int(sum([len(word) for word in sentence.split()]) / len(sentence.split())))