# 1) Создать список из 20 случайных целых чисел в диапазоне от 1 до 100.
# Задание можно выполнить и через обычный цикл и через генератор списков.
#################################################################################

import random
my_list = [random.randint(1, 100) for num in range(20)]
print(my_list)

#################################################################################
# 2) Создать словарь triangle в который записать точки A B C (ключи),
# и их координаты - кортежи (значения), созданные случайным образом с помощью модуля random
# в диапазоне от -10 до 10 по каждой оси.
#################################################################################

import random
triangle = {"A": tuple([random.randint(-10, 10) for num in range(3)]),
            "B": tuple([random.randint(-10, 10) for num in range(3)]),
            "C": tuple([random.randint(-10, 10) for num in range(3)])}
print(triangle)

#################################################################################
# 3) Создать функцию my_print, которая принимает в виде параметра строку и печатает ее
# с тремя символами * вначале и в конце строки.
# Пример:
# my_str = 'I'm the string'
# Печатает ***I'm the string***
#################################################################################

def adding_stars(string):
    star = ("***"+string+"***")
    return star
my_str = '''I'm the string'''
print(adding_stars(my_str))

#################################################################################
# 4) Дан список словарей persons в формате [{"name": "John", "age": 15}, ... ,{"name": "Jack",
# "age": 45}]
# а) Напечатать имя самого молодого человека. Если возраст совпадает - напечатать все имена.
# б) Напечатать самое длинное имя. Если длина имени совпадает - напечатать все имена.
# в) Посчитать среднее количество лет всех людей из списка.
#################################################################################

persons = [{"name": "John", "age": 15},
           {"name": "Sam", "age": 45},
           {"name": "Jacob", "age": 15},
           {"name": "Sam", "age": 36},
           {"name": "Jacks", "age": 45}]

# а) Напечатать имя самого молодого человека. Если возраст совпадает - напечатать все имена.
####################################################################################

young_age = persons[0]["age"]
for num in persons:
    if num["age"] < young_age:
        young_age = num["age"]
young_name = []
for num in persons:
    if num["age"] == young_age:
        young_name.append(num["name"])
print(young_name)

###################################################################################
# б) Напечатать самое длинное имя. Если длина имени совпадает - напечатать все имена.
###################################################################################

len_long_name = 1
for num in persons:
     if len(num["name"]) > len_long_name:
         len_long_name = len(num["name"])
long_name = []
for num in persons:
    if len(num["name"]) == len_long_name:
        long_name.append(num["name"])
print(long_name)

#################################################################################
# в) Посчитать среднее количество лет всех людей из списка.
#################################################################################

name_sum = 0
for num in range(len(persons)):
    name_sum += persons[num]["age"]
print("среднее количество лет всех людей из списка ", int(name_sum / len(persons)))

#################################################################################
# 5) Даны два словаря my_dict_1 и my_dict_2.
# а) Создать список из ключей, которые есть в обоих словарях.
# б) Создать список из ключей, которые есть в первом, но нет во втором словаре.
# в) Создать новый словарь из пар {ключ:значение}, для ключей, которые есть в первом, но нет
# во втором словаре.
# г) Объединить эти два словаря в новый словарь по правилу:
# если ключ есть только в одном из двух словарей - поместить пару ключ:значение,
# если ключ есть в двух словарях - поместить пару {ключ: [значение_из_первого_словаря,
# значение_из_второго_словаря]},
#################################################################################

my_dict_1 = {1: "a", 2: "b", 3: "c", 4: "d"}
my_dict_2 = {1: "q", 2: "w", 5: "y", 6: "u"}

# а) Создать список из ключей, которые есть в обоих словарях.

my_list_a = [key for key in my_dict_1 if key in my_dict_2]
print(my_list_a)

# б) Создать список из ключей, которые есть в первом, но нет во втором словаре.

my_list_b = [key for key in my_dict_1 if key not in my_dict_2]
print(my_list_b)

# в) Создать новый словарь из пар {ключ:значение}, для ключей, которые есть в первом, но нет
# во втором словаре.

my_dict_3 = {key: val for key, val in my_dict_1.items() if key not in my_dict_2}
print(my_dict_3)

# г) Объединить эти два словаря в новый словарь по правилу:
# # если ключ есть только в одном из двух словарей - поместить пару ключ:значение,
# # если ключ есть в двух словарях - поместить пару {ключ: [значение_из_первого_словаря,
# # значение_из_второго_словаря]},
#### my_dict_4 = {**my_dict_1, **my_dict_2}

my_dict_4 ={}
my_dict_4.update({key: (my_dict_1[key], my_dict_2[key]) for key in set(my_dict_1.keys()) & set(my_dict_2.keys())})
my_dict_4.update({key: my_dict_1[key] for key in set(my_dict_1.keys()) - set(my_dict_2.keys())})
my_dict_4.update({key: my_dict_2[key] for key in set(my_dict_2.keys()) - set(my_dict_1.keys())})
print(my_dict_4)

#################################################################################