diff --git a/company.py b/company.py new file mode 100644 index 00000000..c4fa3566 --- /dev/null +++ b/company.py @@ -0,0 +1,118 @@ +""" +В этот раз у нас есть компания, в ней отделы, в отделах люди. У людей есть имя, должность и зарплата. +Ваши задачи такие: +1. Вывести названия всех отделов +2. Вывести имена всех сотрудников компании. +3. Вывести имена всех сотрудников компании с указанием отдела, в котором они работают. +4. Вывести имена всех сотрудников компании, которые получают больше 100к. +5. Вывести позиции, на которых люди получают меньше 80к (можно с повторениями). +6. Посчитать, сколько денег в месяц уходит на каждый отдел – и вывести вместе с названием отдела + +Второй уровень: +7. Вывести названия отделов с указанием минимальной зарплаты в нём. +8. Вывести названия отделов с указанием минимальной, средней и максимальной зарплаты в нём. +9. Вывести среднюю зарплату по всей компании. +10. Вывести названия должностей, которые получают больше 90к без повторений. +11. Посчитать среднюю зарплату по каждому отделу среди девушек (их зовут Мишель, Николь, Кристина и Кейтлин). +12. Вывести без повторений имена людей, чьи фамилии заканчиваются на гласную букву. +""" + +departments = [ + { + "title": "HR department", + "employers": [ + {"first_name": "Daniel", "last_name": "Berger", "position": "Junior HR", "salary_rub": 50000}, + {"first_name": "Michelle", "last_name": "Frey", "position": "Middle HR", "salary_rub": 75000}, + {"first_name": "Kevin", "last_name": "Jimenez", "position": "Middle HR", "salary_rub": 70000}, + {"first_name": "Nicole", "last_name": "Riley", "position": "HRD", "salary_rub": 120000}, + ] + }, + { + "title": "IT department", + "employers": [ + {"first_name": "Christina", "last_name": "Walker", "position": "Python dev", "salary_rub": 80000}, + {"first_name": "Michelle", "last_name": "Gilbert", "position": "JS dev", "salary_rub": 85000}, + {"first_name": "Caitlin", "last_name": "Bradley", "position": "Teamlead", "salary_rub": 950000}, + {"first_name": "Brian", "last_name": "Hartman", "position": "CTO", "salary_rub": 130000}, + ] + }, +] + +for department in departments: # task 1 + print(department['title']) + +for department in departments: # task 2 + for employer in department['employers']: + print(employer['first_name']) + +for department in departments: # task 3 + for employer in department['employers']: + print(f'{employer["first_name"]} работает в {department["title"]}') + +task_salary = 100000 # task 4 +for department in departments: + for employer in department['employers']: + if employer['salary_rub'] > task_salary: + print(f'Заработная плата {employer["first_name"]} превышает {task_salary}') + +task_salary = 80000 # task 5 +for department in departments: + for employer in department['employers']: + if employer['salary_rub'] < task_salary: + print(f'Заработная плата {employer["position"]} ниже {task_salary}') + +for department in departments: # task 6 + department_salary = 0 + for employer in department['employers']: + department_salary += employer['salary_rub'] + print(f'Заработная плата {department["title"]} в месяц составляет {department_salary}') + +for department in departments: # task 7 + department_salary = [] + for employer in department['employers']: + department_salary.append(employer['salary_rub']) + print(f'Отдел {department["title"]} - минимальная зарплата {min(department_salary)}') + +for department in departments: # task 8 + department_salary = [] + avg_salary = 0 + for employer in department['employers']: + department_salary.append(employer['salary_rub']) + avg_salary = sum(department_salary) / len(department_salary) + min_salary = min(department_salary) + max_salary = max(department_salary) + print(f'Отдел {department["title"]}: минимальная зарплата {min_salary}') + print(f'Отдел {department["title"]}: максимальная зарплата {max_salary}') + print(f'Отдел {department["title"]}: cредняя зарплата {int(avg_salary)}') + +salary = [] # task 9 +for department in departments: + for employer in department['employers']: + salary.append(employer['salary_rub']) +avg_salary = sum(salary) / len(salary) +print(f'Средняя зарплата компании {avg_salary}') + +task_salary = 90000 # task 10 +salary_cap = [] +for department in departments: + for employer in department['employers']: + if employer['salary_rub'] > task_salary: + salary_cap.append(employer["position"]) +print(f'{", ".join(salary_cap)} получают больше {task_salary}') + +girls = ['Michelle', 'Nicole', 'Christina', 'Caitlin'] # task 11 +for department in departments: + girl_salary = [] + for employer in department['employers']: + if employer['first_name'] in girls: + girl_salary.append(employer['salary_rub']) + avg_girls_salary = sum(girl_salary) / len(girl_salary) + print(f'Средняя зарплата девушек по {department["title"]} составляет: {int(avg_girls_salary)}') + +end_vowel_letter_in_last_name = [] # task 12 +for department in departments: + for employer in department['employers']: + if employer['last_name'][-1] in 'aeiouy': + end_vowel_letter_in_last_name.append(employer["first_name"]) + end_vowel_letter_in_last_name_set = set(end_vowel_letter_in_last_name) +print(f'Фамилии сотрудников {", ".join(end_vowel_letter_in_last_name_set)} оканчиваются на гласную букву') diff --git a/company_add_tasks.py b/company_add_tasks.py new file mode 100644 index 00000000..54e18d54 --- /dev/null +++ b/company_add_tasks.py @@ -0,0 +1,160 @@ +""" +В этот раз у нас есть компания, в ней отделы, в отделах люди. У людей есть имя, должность и зарплата. +Ваши задачи такие: + +Третий уровень: +Теперь вам пригодится ещё список taxes, в котором хранится информация о налогах на сотрудников из разных департаметов. +Если department None, значит, этот налог применяется ко всем сотрудникам компании. +Иначе он применяется только к сотрудникам департмента, название которого совпадает с тем, что записано по ключу department. +К одному сотруднику может применяться несколько налогов. + +13. Вывести список отделов с суммарным налогом на сотрудников этого отдела. +14. Вывести список всех сотредников с указанием зарплаты "на руки" и зарплаты с учётом налогов. +15. Вывести список отделов с указанием месячной налоговой нагрузки – количеством денег, которые в месяц этот отдел платит налогами. +16. Вывести список отделов, отсортированный по месячной налоговой нагрузке. +17. Вывести всех сотрудников, за которых компания платит больше 100к налогов в год. +18. Вывести имя и фамилию сотрудника, за которого компания платит меньше всего налогов. +""" +import operator + +departments = [ + { + "title": "HR department", + "employers": [ + {"first_name": "Daniel", "last_name": "Berger", "position": "Junior HR", "salary_rub": 50000}, + {"first_name": "Michelle", "last_name": "Frey", "position": "Middle HR", "salary_rub": 75000}, + {"first_name": "Kevin", "last_name": "Jimenez", "position": "Middle HR", "salary_rub": 70000}, + {"first_name": "Nicole", "last_name": "Riley", "position": "HRD", "salary_rub": 120000}, + ] + }, + { + "title": "IT department", + "employers": [ + {"first_name": "Christina", "last_name": "Walker", "position": "Python dev", "salary_rub": 80000}, + {"first_name": "Michelle", "last_name": "Gilbert", "position": "JS dev", "salary_rub": 85000}, + {"first_name": "Caitlin", "last_name": "Bradley", "position": "Teamlead", "salary_rub": 950000}, + {"first_name": "Brian", "last_name": "Hartman", "position": "CTO", "salary_rub": 130000}, + ] + }, +] + +taxes = [ + {"department": None, "name": "vat", "value_percents": 13}, + {"department": "IT department", "name": "hiring", "value_percents": 6}, + {"department": "BizDev Department", "name": "sales", "value_percents": 20}, +] + +# task 13. Вывести список отделов с суммарным налогом на сотрудников этого отдела. +def generating_departments_salaries(departments): + departments_salary = {} + for department in departments: + department_salaries = [] + for employer in department["employers"]: + department_salaries.append(employer["salary_rub"]) + departments_salary[department["title"]] = sum(department_salaries) + return departments_salary + + +def get_departments_tax_rate(taxes, departments): + taxes_for_department = {} + for tax in taxes: + if tax["department"] is not None: + taxes_for_department[tax["department"]] = tax["value_percents"] / 100 + else: + tax_for_all_departments = tax["value_percents"] / 100 + + department_taxes = {} + departments_title = [department["title"] for department in departments] + tax_titles = [tax for tax in taxes_for_department] + + for department in departments_title: + tax = [] + if department in tax_titles: + tax.append(taxes_for_department.get(department)) + tax.append(tax_for_all_departments) + department_taxes[department] = sum(tax) + else: + tax.append(tax_for_all_departments) + department_taxes[department] = sum(tax) + return department_taxes + + +def calculate_department_tax_burden(departments_salary, department_taxes): + departments_tax_burden = {} + for department in departments_salary: + tax_burden = departments_salary.get(department) * department_taxes.get(department) + departments_tax_burden[department] = tax_burden + + for department, tax_burden in departments_tax_burden.items(): + print(f'По {department} суммарный налог на сотрудников равен {tax_burden}') + + +# task 14. Вывести список всех сотрудников с указанием зарплаты "на руки" и зарплаты с учётом налогов. +def calculate_employers_salaries(departments): + tax_of_departments = get_departments_tax_rate(taxes, departments) + for department in departments: + for employer in department['employers']: + employer_tax = employer['salary_rub'] * (tax_of_departments[department["title"]]) / 100 + salary_after_tax = employer['salary_rub'] - employer_tax + print(f'{employer["first_name"]} {employer["last_name"]}: зарплата после вычета налогов' + f' {int(salary_after_tax)}') + print(f'{employer["first_name"]} {employer["last_name"]}: зарплата до вычета налогов' + f' {employer["salary_rub"]}') + + +# task 16. Вывести список отделов, отсортированный по месячной налоговой нагрузке. +def output_departments_name_by_total_taxes(departments_salary, department_taxes): + departments_total_taxes = {} + for department in departments_salary: + tax_burden = departments_salary.get(department) * department_taxes.get(department) + departments_total_taxes[department] = tax_burden + + departments_names_by_total_taxes = sorted( + departments_total_taxes, + key=departments_total_taxes.get, + reverse=True, + ) + + for department_name in departments_names_by_total_taxes: + print(department_name) + + +# task 17. Вывести всех сотрудников, за которых компания платит больше 100к налогов в год. +def output_employers_over_option_tax(departments, option_sum_of_tax): + tax_of_departments = get_departments_tax_rate(taxes, departments) + for department in departments: + for employer in department['employers']: + employer_year_tax = employer['salary_rub'] * 12 * tax_of_departments[department["title"]] + if employer_year_tax > option_sum_of_tax: + print(f'За {employer["first_name"]} {employer["last_name"]} компания платит больше ' + f'{option_sum_of_tax // 1000} тысяч налогов в год') + + +# task 18. Вывести имя и фамилию сотрудника, за которого компания платит меньше всего налогов. +def get_employer_with_max_tax(departments): + tax_of_departments = get_departments_tax_rate(taxes, departments) + employers_taxes_list = [] + for department in departments: + for employer in department['employers']: + employers_taxes = {} + employer_year_tax = employer['salary_rub'] * 12 * tax_of_departments[department["title"]] + employers_taxes = { + "first_name": employer["first_name"], + "last_name": employer["last_name"], + "year_tax": employer_year_tax, + } + employers_taxes_list.append(employers_taxes) + + employer_with_max_tax = max(employers_taxes_list, key=lambda x: x["year_tax"]) + + return employer_with_max_tax["first_name"], employer_with_max_tax["last_name"] + + +if __name__ == "__main__": + salaries_of_departments = generating_departments_salaries(departments) + tax_of_departments = get_departments_tax_rate(taxes, departments) + print(calculate_department_tax_burden(salaries_of_departments, tax_of_departments)) # 13 + print(calculate_employers_salaries(departments)) # 14 + print(output_departments_name_by_total_taxes(salaries_of_departments, tax_of_departments)) # 16 + print(output_employers_over_option_tax(departments, 100000)) # 17 + print(* get_employer_with_max_tax(departments)) # 18 diff --git a/for_challenges.py b/for_challenges.py index 997754da..32d4ba09 100644 --- a/for_challenges.py +++ b/for_challenges.py @@ -2,8 +2,8 @@ # Необходимо вывести имена всех учеников из списка с новой строки names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? - +for name in names: + print(name) # Задание 2 # Необходимо вывести имена всех учеников из списка, рядом с именем показать количество букв в нём @@ -12,9 +12,8 @@ # Петя: 4 names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? - - +for name in names: + print(f'{name}: {len(name)}') # Задание 3 # Необходимо вывести имена всех учеников из списка, рядом с именем вывести пол ученика @@ -25,7 +24,12 @@ 'Маша': False, } names = ['Оля', 'Петя', 'Вася', 'Маша'] -# ??? + +def gender(male_female): + return 'мужской' if male_female else 'женский' + +for name in names: + print(f'{name}: {gender(is_male[name])}') # Задание 4 @@ -40,7 +44,10 @@ ['Вася', 'Маша', 'Саша', 'Женя'], ['Оля', 'Петя', 'Гриша'], ] -# ??? + +print(f'Всего {len(groups)} группы') +for group, names in enumerate(groups, start=1): + print(f'Группа {group}: {len(names)} ученика') # Задание 5 @@ -54,4 +61,6 @@ ['Оля', 'Петя', 'Гриша'], ['Вася', 'Маша', 'Саша', 'Женя'], ] -# ??? \ No newline at end of file + +for group, names in enumerate(groups, start=1): + print(f'Группа {group}: {", ".join(groups[names])}') diff --git a/for_dict_challenges.py b/for_dict_challenges.py index 96062ebc..e21a5965 100644 --- a/for_dict_challenges.py +++ b/for_dict_challenges.py @@ -12,8 +12,12 @@ {'first_name': 'Маша'}, {'first_name': 'Петя'}, ] -# ??? +name_of_students = [student['first_name'] for student in students] +uniq_name = list(set(name_of_students)) + +for name in uniq_name: + print(f'{name}: {name_of_students.count(name)}') # Задание 2 # Дан список учеников, нужно вывести самое часто повторящееся имя @@ -26,8 +30,29 @@ {'first_name': 'Маша'}, {'first_name': 'Оля'}, ] -# ??? +def max_name(students): + name_of_students = [student['first_name'] for student in students] + + names_counter = dict() + for name in name_of_students: + if names_counter.get(name): + names_counter[name] += 1 + else: + names_counter[name] = 1 + + max_names = [] + max_count = 0 + + for name, count_of_name in names_counter.items(): + if count_of_name > max_count: + max_count = count_of_name + max_names = [name] + elif count_of_name == max_count: + max_names.append(name) + return f'Самое частое имя среди учеников: {"".join(max_names)}' + +print(max_name(students)) # Задание 3 # Есть список учеников в нескольких классах, нужно вывести самое частое имя в каждом классе. @@ -51,13 +76,13 @@ {'first_name': 'Саша'}, ], ] -# ??? - +for name in school_students: + print(max_name(name)) # Задание 4 # Для каждого класса нужно вывести количество девочек и мальчиков в нём. # Пример вывода: -# Класс 2a: девочки 2, мальчики 0 +# Класс 2a: девочки 2, мальчики 0 # Класс 2б: девочки 0, мальчики 2 school = [ @@ -72,7 +97,16 @@ 'Миша': True, 'Даша': False, } -# ??? + +for students in school: + male_gender = 0 + female_gender = 0 + for name in students['students']: + if is_male.get(name['first_name']): + male_gender += 1 + else: + female_gender += 1 + print(f'Класс {students["class"]}: девочки {female_gender}, мальчики {male_gender}') # Задание 5 @@ -91,5 +125,29 @@ 'Олег': True, 'Миша': True, } -# ??? +max_male_class = None +max_female_class = None +max_male_gender = 0 +max_female_gender = 0 + +for class_num in school: + male_gender = 0 + female_gender = 0 + for name in class_num['students']: + if is_male.get(name['first_name']): + male_gender += 1 + else: + female_gender += 1 + if male_gender > female_gender: + max_male_gender = male_gender + max_male_class = class_num["class"] + if male_gender > max_male_gender: + max_male_gende = male_gender + else: + max_female_gender = female_gender + max_female_class = class_num["class"] + if female_gender > max_female_gender: + max_female_gender = female_gender +print(f'Больше всего мальчиков в классе {max_male_class}') +print(f'Больше всего девочек в классе {max_female_class}') diff --git a/for_dict_challenges_bonus.py b/for_dict_challenges_bonus.py index c48db990..909964a2 100644 --- a/for_dict_challenges_bonus.py +++ b/for_dict_challenges_bonus.py @@ -1,5 +1,6 @@ """ -Пожалуйста, приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам +Пожалуйста, +приступайте к этой задаче после того, как вы сделали и получили ревью ко всем остальным задачам в этом репозитории. Она значительно сложнее. @@ -54,6 +55,74 @@ def generate_chat_history(): }) return messages +# 1. Вывести айди пользователя, который написал больше всех сообщений. +def is_user_with_max_messages(messages): + # 1. Generate a list of unique id of users who have sent messages + user_id_list_who_sent_messages = [] + for message in messages: + user_id_list_who_sent_messages.append(message["sent_by"]) + unique_user_id_list_who_sent_messages = list(set(user_id_list_who_sent_messages)) + + # 2. Generate a list of dictionaries with users id and sum of messages sent by them + user_id_sum_of_messages = [] + for user_id in unique_user_id_list_who_sent_messages: + user_id_sum_of_messages.append({ + "user_id": user_id, + "sum_of_messages_sent_by": user_id_list_who_sent_messages.count(user_id), + }) + + # 3. Find the maximum number of messages sent + max_sum_of_messages_sent_by = max(user_id_sum_of_messages, key=lambda x: x['sum_of_messages_sent_by'])[ + 'sum_of_messages_sent_by'] + + # 4. Making a list of the users id with the maximum number of messages + users_id_with_max_messages = [] + for user_id in user_id_sum_of_messages: + if user_id['sum_of_messages_sent_by'] == max_sum_of_messages_sent_by: + users_id_with_max_messages.append(user_id['user_id']) + + return users_id_with_max_messages + + +# 2. Вывести айди пользователя, на сообщения которого больше всего отвечали. +def is_user_with_max_reply_messages(messages): + # 1. Формируем список id сообщений на которые отвечали -> уникальные + messages_id_that_were_replied = [] + for message in messages: + if message["reply_for"] != [] and message["reply_for"] is not None: + messages_id_that_were_replied.append(message["reply_for"]) + + unique_messages_id_that_were_replied = set(messages_id_that_were_replied) + + # 2. Формируем список словарей: id сообщения, кол-во сообщений-ответов на это сообщение + messages_id_that_were_replied_with_sum_of_answers = [] + for message_id in unique_messages_id_that_were_replied: + messages_id_that_were_replied_with_sum_of_answers.append({ + "message_id": message_id, + "number_of_answers": messages_id_that_were_replied.count(message_id), + }) + print(messages_id_that_were_replied_with_sum_of_answers) + + # 3. Выводим id сообщения с максимальным количеством ответов на него + message_id_with_max_sum_of_answers = max(messages_id_that_were_replied_with_sum_of_answers, key=lambda x: x[ + "number_of_answers"]) + print(f'айди сообщения sum = {message_id_with_max_sum_of_answers}') + + # 4. Кладем в пременную id сообщения с максимальным количеством ответов на него + message_id_with_max_sum_of_answers_var = message_id_with_max_sum_of_answers['message_id'] + print(f'айди сообщения = {message_id_with_max_sum_of_answers_var}') + + # 5. Формируем словарь из id сообщений и id пользователей-отправителей этих сообщений + messages_id_and_users_id_sent_by = {} + for message in messages: + messages_id_and_users_id_sent_by[message["id"]] = message["sent_by"] + print(f'Словарь = {messages_id_and_users_id_sent_by}') + + # 6. Выводим id пользователя на сообщения которого больше всего отвечали + + return messages_id_and_users_id_sent_by[message_id_with_max_sum_of_answers_var] if __name__ == "__main__": - print(generate_chat_history()) + messages = generate_chat_history() + print(is_user_with_max_messages(messages)) + print(is_user_with_max_reply_messages(messages)) \ No newline at end of file diff --git a/string_challenges.py b/string_challenges.py index 856add2d..3456b421 100644 --- a/string_challenges.py +++ b/string_challenges.py @@ -1,28 +1,36 @@ # Вывести последнюю букву в слове word = 'Архангельск' -# ??? +print(word[-1]) # Вывести количество букв "а" в слове word = 'Архангельск' -# ??? +print(word.lower().count('а')) # Вывести количество гласных букв в слове word = 'Архангельск' -# ??? - +vowel_letters = 'аеёиоуыэюя' +count_vowel_letters = 0 +for letters in word.lower(): + if letters in vowel_letters: + count_vowel_letters += 1 +print(f'Количество гласных букв в слове {word}: {count_vowel_letters}') # Вывести количество слов в предложении sentence = 'Мы приехали в гости' -# ??? - +word_count = sentence.count(' ') + 1 +print(f'Количество слов в предложении: {word_count}') # Вывести первую букву каждого слова на отдельной строке sentence = 'Мы приехали в гости' -# ??? - +for word in sentence.split(): + print(word[0]) # Вывести усреднённую длину слова в предложении sentence = 'Мы приехали в гости' -# ??? \ No newline at end of file +len_word = 0 +for word in sentence.split(): + len_word += len(word) +avg_len_word = len_word / len(sentence.split()) +print(avg_len_word)