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 997754da..0e788c16 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]: + 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..ea481e97 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -12,8 +12,16 @@ {'first_name': 'Маша'}, {'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 + +for repetition_rate in number_of_times_of_name(students): + print(f'{repetition_rate}: {number_of_times_of_name(students)[repetition_rate]}') # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя @@ -26,8 +34,14 @@ {'first_name': 'Маша'}, {'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 + +print(f'Самое повторяющиеся имя: {most_common_name(students)}') # Задание 3 # Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. @@ -51,9 +65,13 @@ {'first_name': 'Саша'}, ], ] -# ??? +class_counter = 1 +for grade in school_students: + print(f'Самое повторяющиеся имя в {class_counter} классе: {most_common_name(grade)}') + class_counter += 1 + # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: @@ -72,8 +90,23 @@ 'Миша': True, 'Даша': 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: + 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 # По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков @@ -91,5 +124,14 @@ 'Олег': True, 'Миша': True, } -# ??? +max_boys = max_girls = 0 +for grade in school: + 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 c48db990..ec640444 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -22,18 +22,17 @@ Установите библиотеку lorem, чтобы она работала. Нужно: -1. Вывести айди пользователя, который написал больше всех сообщений. +1. Вывести айди пользователя, который написал больше всех сообщений. 2. Вывести айди пользователя, на сообщения которого больше всего отвечали. -3. Вывести айди пользователей, сообщения которых видело больше всего уникальных пользователей. -4. Определить, когда в чате больше всего сообщений: утром (до 12 часов), днём (12-18 часов) или вечером (после 18 часов). -5. Вывести идентификаторы сообщений, который стали началом для самых длинных тредов (цепочек ответов). +3$. Вывести айди пользователей, сообщения которых видело больше всего уникальных пользователей. +4$. Определить, когда в чате больше всего сообщений: утром (до 12 часов), днём (12-18 часов) или вечером (после 18 часов). +5$. Вывести идентификаторы сообщений, который стали началом для самых длинных тредов (цепочек ответов). Весь код стоит разбить на логические части с помощью функций. """ import random import uuid import datetime - import lorem @@ -55,5 +54,121 @@ def generate_chat_history(): return messages +def user_messages(messages): + user_messages = {} + for message in messages: + sender_id = message['sent_by'] + message_id = message['id'] + + 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 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_of_responses_per_message(messages): + number_answers = {} + 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 got_the_most_responses(number_answers): + number_responses_per_user = {} + 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 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 = {} + for user_id in user_messages: + 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 user_id in how_many_views: + if how_many_views[user_id] == most_viewed: + return user_id + + +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 time in sending_time: + if sending_time[time] == busiest_time: + return time + + +def is_there_answer(id): + for message in chat_history: + if message['reply_for'] == id: + return True + return False +def reply_for_from_id(id): + for message in chat_history: + if message['id'] == id: + return message['reply_for'] +def message_threads(messages): + message_threads = {} + for message in messages: + answer = is_there_answer(message['id']) + count = 0 + by = message['id'] + beginning = message['reply_for'] + if answer == False: + while beginning is not 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 message_id in message_threads: + if message_threads[message_id] == max_branch_length: + return message_id + + if __name__ == "__main__": - print(generate_chat_history()) + chat_history = generate_chat_history() + + print(f'ID пользователя, который написал больше всех сообщений: {who_wrote_the_most_posts(user_messages(chat_history))}', end='\n\n') #1 + + print(f'ID пользователя, на которого больше всего отвечали: {got_the_most_responses(number_of_responses_per_message(chat_history))}', end='\n\n') #2 + + 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(f'Начало для самых длинных тредов: {message_threads(chat_history)}') #5 \ No newline at end of file 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