diff --git a/for_challenges.py b/for_challenges.py index 8a326252..1c740a16 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -3,8 +3,8 @@ names = ['Оля', 'Петя', 'Вася', 'Маша'] -for i in names: - print (i) +for name in names: + print(name) # Задание 2 # Необходимо вывести имена всех учеников из списка, рядом с именем показать количество букв в нём @@ -14,8 +14,10 @@ names = ['Оля', 'Петя', 'Вася', 'Маша'] -for i in names: - print (i,len(i) ) +for name in names: + + print(f"{name}: {len(name)}") + # Задание 3 @@ -29,8 +31,8 @@ } names = ['Оля', 'Петя', 'Вася', 'Маша'] -for i in names: - print(i, is_male.get(i)) +for name in names: + print(name, is_male.get(i)) # Задание 4 @@ -71,5 +73,5 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ] -for i, group in enumerate(groups, start=1): - print(f"Группа {i}: {', '.join(group)}") \ No newline at end of file +for name , group in enumerate(groups, start=1): + print(f"Группа {name}: {', '.join(group)}") \ No newline at end of file diff --git a/for_dict_challenges.py b/for_dict_challenges.py index d4dc5e8b..c4513fb1 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -132,6 +132,7 @@ + # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index 9f35a0a0..2be5d6d3 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -29,7 +29,7 @@ 5. Вывести идентификаторы сообщений, который стали началом для самых длинных тредов (цепочек ответов). Весь код стоит разбить на логические части с помощью функций. -""" +""" import random import uuid import datetime @@ -37,6 +37,9 @@ import lorem + + + def generate_chat_history(): messages_amount = random.randint(200, 1000) users_ids = list( diff --git a/string_challenges.py b/string_challenges.py index b7dad9cc..41cda1da 100644 --- a/string_challenges.py +++ b/string_challenges.py @@ -7,11 +7,13 @@ # Вывести количество букв "а" в слове word = 'Архангельск' print(word.count("а")) +print(word[-1]) # Вывести количество гласных букв в слове word = 'Архангельск' -vowels = 'аеёиоуыэюяАЕЁИОУЫЭЮЯ' +word = word.lower() +vowels = 'аеёиоуыэюя' vowel_count = sum(1 for char in word if char in vowels) print(f"Количество гласных в слове '{word}': {vowel_count}") diff --git "a/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/README.md" "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/README.md" new file mode 100644 index 00000000..5d29d184 --- /dev/null +++ "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/README.md" @@ -0,0 +1,14 @@ +LearnPython: задания для второй недели +================================ + +### Как выполнять задание + +1. На github в правом верхнем углу нажмите Fork ![](https://learn.python.ru/lessons/img/homework1_1.png) +2. Репозиторий продублируется у вас на аккаунте +3. В своем репозитории нажмите зеленую кнопку Clone or Download и скопируйте ссылку ![](https://learn.python.ru/lessons/img/homework1_2.png) +4. В командной строке у себя на копьютере перейдите в папку `C:\projects` на Windows или `~/projects` на Linux и Mac +5. Наберите команду `git clone СКОПРИОВАННЫЙ URL` +6. Код урока появится в папке `basic_exercises` +7. Выполните задания в каждом из файлов, сделайте commit и push и оправьте ссылки на ваш репозиторий куратору + +Если у вас возникли сложности при выполнении задания - напишите своему куратору! diff --git "a/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_challenges.py" "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_challenges.py" new file mode 100644 index 00000000..71f7d23c --- /dev/null +++ "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_challenges.py" @@ -0,0 +1,76 @@ +# Задание 1 +# Необходимо вывести имена всех учеников из списка с новой строки + +names = ['Оля', 'Петя', 'Вася', 'Маша'] + +for i in names: + print (i) + +# Задание 2 +# Необходимо вывести имена всех учеников из списка, рядом с именем показать количество букв в нём +# Пример вывода: +# Оля: 3 +# Петя: 4 + +names = ['Оля', 'Петя', 'Вася', 'Маша'] + +for i in names: + print (i,len(i) ) + + +# Задание 3 +# Необходимо вывести имена всех учеников из списка, рядом с именем вывести пол ученика + +is_male = { + 'Оля': False, # если False, то пол женский + 'Петя': True, # если True, то пол мужской + 'Вася': True, + 'Маша': False, +} +names = ['Оля', 'Петя', 'Вася', 'Маша'] + +for i in names: + print(i, is_male.get(i)) + + +# Задание 4 +# Даны группу учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней +# Пример вывода: +# Всего 2 группы. +# Группа 1: 2 ученика. +# Группа 2: 4 ученика. + +groups = [ + ['Вася', 'Маша'], + ['Вася', 'Маша', 'Саша', 'Женя'], + ['Оля', 'Петя', 'Гриша'], +] + +print(f"Всего {len(groups)} Группы" ) +print(f"Группа 1 {len(groups[0])} Участников" ) +print(f"Группа 2 {len(groups[1])} Участников" ) +print(f"Группа 3 {len(groups[2])} Участников" ) + + + +# Задание 5 +# Для каждой пары учеников нужно с новой строки перечислить учеников, которые в неё входят +# Пример вывода: +# Группа 1: Вася, Маша +# Группа 2: Оля, Петя, Гриша + +groups = [ + ['Вася', 'Маша'], + ['Оля', 'Петя', 'Гриша'], + ['Вася', 'Маша', 'Саша', 'Женя'], +] + + +groups = [ + ['Вася', 'Маша'], + ['Оля', 'Петя', 'Гриша'], + ['Вася', 'Маша', 'Саша', 'Женя'], +] + +for i, group in enumerate(groups, start=1): + print(f"Группа {i}: {', '.join(group)}") \ No newline at end of file diff --git "a/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_dict_challenges.py" "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_dict_challenges.py" new file mode 100644 index 00000000..39c99f85 --- /dev/null +++ "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_dict_challenges.py" @@ -0,0 +1,224 @@ +# Задание 1 +# Дан список учеников, нужно посчитать количество повторений каждого имени ученика +# Пример вывода: +# Вася: 1 +# Маша: 2 +# Петя: 2 + +students = [ + {'first_name': 'Вася'}, + {'first_name': 'Петя'}, + {'first_name': 'Маша'}, + {'first_name': 'Маша'}, + {'first_name': 'Петя'}, +] +count_name = {} + +for student in students: # лучше назвать student вместо names + name = student['first_name'] # обращаемся к текущему студенту + + if name in count_name: + count_name[name] += 1 + else: + count_name[name] = 1 + +# Вывод делаем ПОСЛЕ цикла, когда все посчитано +for name, count in count_name.items(): + print(f"{name}: {count}") + + + + + + + + + + + + + + + + + + + +# Задание 2 +# Дан список учеников, нужно вывести самое часто повторящееся имя +# Пример вывода: +# Самое частое имя среди учеников: Маша +students = [ + {'first_name': 'Вася'}, + {'first_name': 'Петя'}, + {'first_name': 'Маша'}, + {'first_name': 'Маша'}, + {'first_name': 'Оля'}, +] +all_names = [student['first_name'] for student in students] +count_name = {} +for stud in students: + name = stud["first_name"] + if name in count_name: + count_name[name] +=1 + else: + count_name[name] = 1 + +print(count_name) +max_count = 0 +most_common_name = "" + +for name in set(all_names): # set() убирает дубликаты + count = all_names.count(name) + if count > max_count: + max_count = count + most_common_name = name + +print(f"Самое частое имя среди учеников: {most_common_name}") + + + + +# Задание 3 +# Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. +# Пример вывода: +# Самое частое имя в классе 1: Вася +# Самое частое имя в классе 2: Маша + +school_students = [ + [ # это – первый класс + {'first_name': 'Вася'}, + {'first_name': 'Вася'}, + ], + [ # это – второй класс + {'first_name': 'Маша'}, + {'first_name': 'Маша'}, + {'first_name': 'Оля'}, + ],[ # это – третий класс + {'first_name': 'Женя'}, + {'first_name': 'Петя'}, + {'first_name': 'Женя'}, + {'first_name': 'Саша'}, + ], +] + + + +for class_index in range(len(school_students)): + count_name = {} + + + for student in school_students[class_index]: + name = student['first_name'] + if name in count_name: + count_name[name] += 1 + else: + count_name[name] = 1 + + + max_count = 0 + most_common_name = "" + for name, count in count_name.items(): + if count > max_count: + max_count = count + most_common_name = name + + print(f"Самое частое имя в классе {class_index + 1}: {most_common_name}") + + + + + + + + +# Задание 4 +# Для каждого класса нужно вывести количество девочек и мальчиков в нём. +# Пример вывода: +# Класс 2a: девочки 2, мальчики 0 +# Класс 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': 'Маша'}]}, +] +is_male = { + 'Олег': True, + 'Маша': False, + 'Оля': False, + 'Миша': True, + 'Даша': False, +} +# ??? + +def get_gender_text(name): + """Возвращает текстовое описание пола""" + if name in is_male: + return "мальчик" if is_male[name] else "девочка" + return "пол неизвестен" + + +for class_info in school: + print(f"Класс: {class_info['class']}") + for student in class_info['students']: + name = student['first_name'] + print(f" {name} - {get_gender_text(name)}") + + +# Задание 5 +# По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков +# Пример вывода: +# Больше всего мальчиков в классе 3c +# Больше всего девочек в классе 2a + +school = [ + {'class': '2a', 'students': [{'first_name': 'Маша'}, {'first_name': 'Оля'}]}, + {'class': '3c', 'students': [{'first_name': 'Олег'}, {'first_name': 'Миша'}]}, +] +is_male = { + 'Маша': False, + 'Оля': False, + 'Олег': True, + 'Миша': True, +} + + + +# Создаем словари для подсчета +boys_by_class = {} +girls_by_class = {} + +# Подсчитываем мальчиков и девочек по классам +for class_info in school: + class_name = class_info['class'] + boys_count = 0 + girls_count = 0 + + for student in class_info['students']: + name = student['first_name'] + if name in is_male: + if is_male[name]: + boys_count += 1 + else: + girls_count += 1 + + boys_by_class[class_name] = boys_count + girls_by_class[class_name] = girls_count + +# Находим класс с максимальным количеством мальчиков +max_boys_class = max(boys_by_class, key=boys_by_class.get) +max_boys_count = boys_by_class[max_boys_class] + +# Находим класс с максимальным количеством девочек +max_girls_class = max(girls_by_class, key=girls_by_class.get) +max_girls_count = girls_by_class[max_girls_class] + +# Выводим результаты +print(f"Больше всего мальчиков в классе {max_boys_class}") +print(f"Больше всего девочек в классе {max_girls_class}") + + + + + diff --git "a/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_dict_challenges_bonus.py" "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_dict_challenges_bonus.py" new file mode 100644 index 00000000..9f35a0a0 --- /dev/null +++ "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/for_dict_challenges_bonus.py" @@ -0,0 +1,70 @@ +""" +Пожалуйста, приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам +в этом репозитории. Она значительно сложнее. + + +Есть набор сообщений из чата в следующем формате: + +``` +messages = [ + { + "id": "efadb781-9b04-4aad-9afe-e79faef8cffb", + "sent_at": datetime.datetime(2022, 10, 11, 23, 11, 11, 721), + "sent_by": 46, # id пользователя-отправителя + "reply_for": "7b22ae19-6c58-443e-b138-e22784878581", # id сообщение, на которое это сообщение является ответом (может быть None) + "seen_by": [26, 91, 71], # идентификаторы пользователей, которые видели это сообщение + "text": "А когда ревью будет?", + } +] +``` + +Так же есть функция `generate_chat_history`, которая вернёт список из большого количества таких сообщений. +Установите библиотеку lorem, чтобы она работала. + +Нужно: +1. Вывести айди пользователя, который написал больше всех сообщений. +2. Вывести айди пользователя, на сообщения которого больше всего отвечали. +3. Вывести айди пользователей, сообщения которых видело больше всего уникальных пользователей. +4. Определить, когда в чате больше всего сообщений: утром (до 12 часов), днём (12-18 часов) или вечером (после 18 часов). +5. Вывести идентификаторы сообщений, который стали началом для самых длинных тредов (цепочек ответов). + +Весь код стоит разбить на логические части с помощью функций. +""" +import random +import uuid +import datetime + +import lorem + + +def generate_chat_history(): + messages_amount = random.randint(200, 1000) + users_ids = list( + {random.randint(1, 10000) for _ in range(random.randint(5, 20))} + ) + sent_at = datetime.datetime.now() - datetime.timedelta(days=100) + messages = [] + for _ in range(messages_amount): + sent_at += datetime.timedelta(minutes=random.randint(0, 240)) + messages.append({ + "id": uuid.uuid4(), + "sent_at": sent_at, + "sent_by": random.choice(users_ids), + "reply_for": random.choice( + [ + None, + ( + random.choice([m["id"] for m in messages]) + if messages else None + ), + ], + ), + "seen_by": random.sample(users_ids, + random.randint(1, len(users_ids))), + "text": lorem.sentence(), + }) + return messages + + +if __name__ == "__main__": + print(generate_chat_history()) diff --git "a/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/string_challenges.py" "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/string_challenges.py" new file mode 100644 index 00000000..57c56096 --- /dev/null +++ "b/\320\235\320\276\320\262\320\260\321\217 \320\277\320\260\320\277\320\272\320\260/string_challenges.py" @@ -0,0 +1,55 @@ +# Вывести последнюю букву в слове +word = 'Архангельск' + +print(word[10:11]) + + + +# Вывести количество букв "а" в слове +word = 'Архангельск' +print(word.count("а")) + + +# Вывести количество гласных букв в слове +word = 'Архангельск' +vowels = 'аеёиоуыэюяАЕЁИОУЫЭЮЯ' +vowel_count = sum(1 for char in word if char in vowels) +print(f"Количество гласных в слове '{word}': {vowel_count}") + + +# Вывести количество слов в предложении +sentence = 'Мы приехали в гости' +# ??? +word_count = len(sentence.split()) +print(f"Количество слов в предложении: {word_count}") + +# Вывести первую букву каждого слова на отдельной строке +sentence = 'Мы приехали в гости' +word = sentence.split()#[Мы приехали в гости] +for i in word: + print(i[0]) + + + + + + + + + + + + + +# Вывести усреднённую длину слова в предложении + + +sentence = 'Мы приехали в гости' + +words = sentence.split() + +total_length = sum(len(word) for word in words) + +average_length = total_length / len(words) if words else 0 + +print(f"Средняя длина слова: {average_length:.2f}") \ No newline at end of file