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
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
settings.py
*.log
.vscode/
.idea/
env/
.DS_Store
__pycache__/
/env
19 changes: 16 additions & 3 deletions for_challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
# Необходимо вывести имена всех учеников из списка с новой строки

names = ['Оля', 'Петя', 'Вася', 'Маша']
# ???
for name in names:
print(name)


# Задание 2
Expand All @@ -12,7 +13,8 @@
# Петя: 4

names = ['Оля', 'Петя', 'Вася', 'Маша']
# ???
for name in names:
print(name, len(name))


# Задание 3
Expand All @@ -24,6 +26,11 @@
'Вася': True,
'Маша': False,
}
for name in is_male:
if is_male[name]:
print(f'{name}, мужской пол')
else:
print(f'{name}, женский пол')
names = ['Оля', 'Петя', 'Вася', 'Маша']
# ???

Expand All @@ -40,6 +47,9 @@
['Вася', 'Маша', 'Саша', 'Женя'],
['Оля', 'Петя', 'Гриша'],
]
print(f'Всего групп: {len(groups)}')
for group in range(len(groups)):
print(f'Группа {group+1}: {len(groups[group])} ученика')
# ???


Expand All @@ -54,4 +64,7 @@
['Оля', 'Петя', 'Гриша'],
['Вася', 'Маша', 'Саша', 'Женя'],
]
# ???
# ???
for group in range(len(groups)):
print(f'Группа {group+1}:', end=' ')
print(*groups[group], sep=', ')
52 changes: 47 additions & 5 deletions for_dict_challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
# Дан список учеников, нужно вывести самое часто повторящееся имя
Expand All @@ -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
# Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе.
Expand All @@ -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
# Для каждого класса нужно вывести количество девочек и мальчиков в нём.
# Пример вывода:
Expand All @@ -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
# По информации о учениках разных классов нужно найти класс, в котором больше всего девочек и больше всего мальчиков
Expand All @@ -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}')
127 changes: 121 additions & 6 deletions for_dict_challenges_bonus.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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
23 changes: 17 additions & 6 deletions string_challenges.py
Original file line number Diff line number Diff line change
@@ -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 = 'Мы приехали в гости'
# ???
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)