Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 35 additions & 8 deletions for_challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
# Необходимо вывести имена всех учеников из списка с новой строки

names = ['Оля', 'Петя', 'Вася', 'Маша']
# ???

print(*names, sep='\n')

# Задание 2
# Необходимо вывести имена всех учеников из списка, рядом с именем показать количество букв в нём
Expand All @@ -12,8 +11,8 @@
# Петя: 4

names = ['Оля', 'Петя', 'Вася', 'Маша']
# ???

for name in names:
print(f'{name}: {len(name)}')

# Задание 3
# Необходимо вывести имена всех учеников из списка, рядом с именем вывести пол ученика
Expand All @@ -25,8 +24,8 @@
'Маша': False,
}
names = ['Оля', 'Петя', 'Вася', 'Маша']
# ???

for name in names:
print(f'{name}: {"мужской" if is_male[name] else "женский"}')

# Задание 4
# Даны группу учеников. Нужно вывести количество групп и для каждой группы – количество учеников в ней
Expand All @@ -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}:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тот редкий случай когда строчка комментария не помешала бы.

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
# Для каждой пары учеников нужно с новой строки перечислить учеников, которые в неё входят
# Пример вывода:
Expand All @@ -54,4 +79,6 @@
['Оля', 'Петя', 'Гриша'],
['Вася', 'Маша', 'Саша', 'Женя'],
]
# ???

for group_number, group in enumerate(groups, start=1):
print(f'Группа {group_number}: {", ".join(group)}')
56 changes: 49 additions & 7 deletions for_dict_challenges.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,30 @@
from collections import Counter


# Задание 1
# Дан список учеников, нужно посчитать количество повторений каждого имени ученика
# Пример вывода:
# Вася: 1
# Маша: 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': 'Петя'},
{'first_name': 'Маша'},
{'first_name': 'Маша'},
{'first_name': 'Петя'},
]
# ???

for name, count_students in Counter(get_students_first_names(students)).items():
print(f'{name}: {count_students}')

print('_' * 75)

# Задание 2
# Дан список учеников, нужно вывести самое часто повторящееся имя
Expand All @@ -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
# Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе.
# Пример вывода:
Expand All @@ -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': 'Миша'}]},
Expand All @@ -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
# По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков
Expand All @@ -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]}")
84 changes: 79 additions & 5 deletions for_dict_challenges_bonus.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
import random
import uuid
import datetime
import lorem
from itertools import groupby
from collections import Counter

"""
Пожалуйста, приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам
в этом репозитории. Она значительно сложнее.
Expand Down Expand Up @@ -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():
Expand Down Expand Up @@ -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):
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Классный нейминг!

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()))
19 changes: 8 additions & 11 deletions string_challenges.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
# Вывести последнюю букву в слове
word = 'Архангельск'
# ???

print(word[-1])

# Вывести количество букв "а" в слове
word = 'Архангельск'
# ???

print(word.lower().count('а'))

# Вывести количество гласных букв в слове
word = 'Архангельск'
# ???

vowels = 'аеиоуэюяыё'
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

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 = 'Мы приехали в гости'
# ???
print(int(sum([len(word) for word in sentence.split()]) / len(sentence.split())))