'''Тема урока: словари в Python
Встроенные функции len(),sum(),min(),max()
Оператор принадлежности in
Перебор словарей
Распаковка словаря
Форматированный вывод словарей
Сравнение словарей
Методы keys(), values() и items()
Аннотация. В этом уроке мы изучим основной функционал при работе с словарями.

Основы работы с словарями
Работа с словарями похожа на работу со списками, поскольку и словари, и списки содержат в качестве отдельных элементов
пары: в словарях ключ: значение, в списках индекс: значение.

Функция len()
Длиной словаря называется количество его элементов. Для определения длины словаря используют встроенную функцию len()
(от слова length – длина).

Следующий программный код:

fruits = {'Apple': 70, 'Grape': 100, 'Banana': 80}
capitals = {'Россия': 'Москва', 'Франция': 'Париж'}

print(len(fruits))
print(len(capitals))
выведет:

3
2
Оператор принадлежности in
Оператор in позволяет проверить, содержит ли словарь заданный ключ.

Рассмотрим код:

capitals = {'Россия': 'Москва', 'Франция': 'Париж', 'Чехия': 'Прага'}

if 'Франция' in capitals:
    print('Столица Франции - это', capitals['Франция'])
Такой код проверяет, содержит ли словарь capitals элемент с ключом Франция и выводит соответствующий текст:

Столица Франции - это Париж
   Можно использовать оператор in вместе с логическим оператором not.

Не забывайте, что при обращении по несуществующему ключу, возникнет ошибка во время выполнения программы.

Приведенный ниже код:

capitals = {'Россия': 'Москва', 'Франция': 'Париж', 'Чехия': 'Прага'}

print(capitals['Англия'])
приводит к возникновению ошибки:

KeyError: 'Англия'
Оператор принадлежности in на словарях работает очень быстро, намного быстрее, чем на списках, поэтому если нужен
многократный поиск в коллекции данных, словарь – подходящий выбор.

Встроенные функции sum(), min(), max()
Встроенная функция sum() принимает в качестве аргумента словарь с числовыми ключами и вычисляет сумму его ключей.

Следующий программный код:

my_dict = {10: 'Россия', 20: 'США', 30: 'Франция'}

print('Сумма всех ключей словаря =', sum(my_dict))
выводит:

Сумма всех ключей словаря = 60
   Для корректной работы функции sum() ключами словаря должны быть именно числа.

Встроенные функции min() и max() принимают в качестве аргумента словарь и находят минимальный и максимальный ключ
соответственно, при этом ключ может принадлежать к любому типу данных, для которого возможны операции
порядка <, <=, >, >= (числа, строки, и т.д.).

Следующий программный код:

capitals = {'Россия': 'Москва', 'Франция': 'Париж', 'Чехия': 'Прага'}
months = {1: 'Январь', 2: 'Февраль', 3: 'Март'}

print('Минимальный ключ =', min(capitals))
print('Максимальный ключ =', max(months))
выводит:

Минимальный ключ = Россия
Максимальный ключ = 3
Сравнение словарей
Словари можно сравнивать между собой. Равные словари имеют одинаковое количество элементов и содержат равные
элементы (ключ: значение). Для сравнения словарей используются операторы == и !=.

Приведенный ниже код:

months1 = {1: 'Январь', 2: 'Февраль'}
months2 = {1: 'Январь', 2: 'Февраль', 3: 'Март'}
months3 = {3: 'Март', 1: 'Январь', 2: 'Февраль'}

print(months1 == months2)
print(months2 == months3)
print(months1 != months3)
выводит:

False
True
True
Примечания
Примечание 1. Обращение по индексу и срезы недоступны для словарей.

Примечание 2. Операция конкатенации + и умножения на число * недоступны для словарей.

Примечание 3. Словари нужно использовать в следующих случаях:

Подсчет числа каких-то объектов. В этом случае нужно завести словарь, в котором ключи — названия объектов, а
значения — их количество.
Хранение каких-либо данных, связанных с объектом. Ключи — наименования объектов, значения — связанные с ними данные.
Например, если нужно по названию месяца определить его порядковый номер, то это можно сделать при помощи словаря
num = {'January': 1, 'February': 2, 'March': 3, ...}.
Установка соответствия между объектами (например, “родитель—потомок”). Ключ — объект, значение — соответствующий
ему объект.
Если нужен обычный массив, где максимальное значение индекса элемента очень велико, но при этом используются не все
 возможные индексы (так называемый “разреженный массив”), то для экономии памяти можно использовать ассоциативный
 массив — словарь.
Примечание 4. О том, как устроен словарь (тип dict) в Python можно почитать в статье.

Примечание 5. Исходный код словаря (тип dict) в Python можно найти тут.

'''


'''Дополните приведенный код так, чтобы он вывел сумму минимального и максимального ключа в словаре my_dict.'''
# my_dict = {1.12: 'aa', 67.9: 45, 3.11: 'ccc', 7.9: 'dd', 9.2: 'ee', 7.1: 'ff', 0.12: 'qq', 1.91: 'aa',
#            10.12: [1, 2, 3], 99.0: {9, 0, 1}}
#
# print(min(my_dict)+max(my_dict))


# users = [{'name': 'Todd', 'phone': '551-1414', 'email': 'todd@gmail.com'},
#          {'name': 'Helga', 'phone': '555-1618', 'email': 'helga@mail.net'},
#          {'name': 'Olivia', 'phone': '449-3141', 'email': ''},
#          {'name': 'LJ', 'phone': '555-2718', 'email': 'lj@gmail.net'},
#          {'name': 'Ruslan', 'phone': '422-145-9098', 'email': 'rus-lan.cha@yandex.ru'},
#          {'name': 'John', 'phone': '233-421-32', 'email': ''},
#          {'name': 'Lara', 'phone': '+7998-676-2532', 'email': 'g.lara89@gmail.com'},
#          {'name': 'Alina', 'phone': '+7948-799-2434', 'email': 'ali.ch.b@gmail.com'},
#          {'name': 'Robert', 'phone': '420-2011', 'email': ''},
#          {'name': 'Riyad', 'phone': '128-8890-128', 'email': 'r.mahrez@mail.net'},
#          {'name': 'Khabib', 'phone': '+7995-600-9080', 'email': 'kh.nurmag@gmail.com'},
#          {'name': 'Olga', 'phone': '6449-314-1213', 'email': ''},
#          {'name': 'Roman', 'phone': '+7459-145-8059', 'email': 'roma988@mail.ru'},
#          {'name': 'Maria', 'phone': '12-129-3148', 'email': 'm.sharapova@gmail.com'},
#          {'name': 'Fedor', 'phone': '+7445-341-0545', 'email': ''},
#          {'name': 'Tim', 'phone': '242-449-3141', 'email': 'timm.ggg@yandex.ru'}]
# for value in users:
#     if ['phone']:
#         print(users['name'])

# >>> nums = {'one': (1, 'I'), 'two': (2, 'II')}
# >>> person1 = {'name': 'Tom', 'data': [4, 2.5]}
# >>> person1['data'][0]

'''Строковое представление
Напишите программу, которая будет превращать натуральное число в строку, заменяя все цифры в числе на слова:

00 на zero;
11 на one;
22 на two;
33 на three;
44 на four;
55 на five;
66 на six;
77 на seven;
88 на eight;
99 на nine.
Формат входных данных
На вход программе подается натуральное число.

Формат выходных данных
Программа должна вывести строковое представление числа.

Примечание. Используйте словарь вместо условного оператора.

Sample Input 1:

230
Sample Output 1:

two three zero
Sample Input 2:

7
Sample Output 2:

seven
Sample Input 3:

11111111
Sample Output 3:

one one one one one one one one
Sample Input 4:

83
Sample Output 4:

eight three'''

# number = int(input())
# def Numbers_To_Words (number):
#     dictionary = {'1': "one", '2': "two", '3': "three", '4': "four", '5': "five", '6': "six",
#             '7': "seven", '8': "eight", '9': "nine", '0': "zero"}
#     return " ".join(map(lambda x: dictionary[x], str(number)))
#
#
# print (Numbers_To_Words(number))


# nums = dict(zip('0123456789', 'zero one two three four five six seven eight nine'.split()))
# print(*[nums[x] for x in input()])

# digits = {
#     0: "zero",
#     1: "one",
#     2: "two",
#     3: "three",
#     4: "four",
#     5: "five",
#     6: "six",
#     7: "seven",
#     8: "eight",
#     9: "nine"
# }
#
# print(*[digits[int(c)] for c in input()])

'''Информация об учебных курсах
Напишите программу, которая по номеру курса выводит информацию о данном курсе. 

Номер курса (ключ)	Номер аудитории (значение)	Преподаватель (значение)	Время (значение)
CS101	3004	Хайнс	8:00
CS102	4501	Альварадо	9:00
CS103	6755	Рич	10:00
NT110	1244	Берк	11:00
CM241	1411	Ли	13:00
Формат входных данных
На вход программе подается одна строка – номер курса.

Формат выходных данных
Программа должна вывести номер курса, затем номер аудитории, имя преподавателя и время проведения курса в соответствии 
с примерами.

Примечание 1. Используйте словарь вместо условного оператора.

Примечание 2. Для удобного вывода используйте строковый метод format() или f-строки.

Sample Input:

CS101
Sample Output:

CS101: 3004, Хайнс, 8:00'''

#
# d = {
#     "CS101": "CS101: 3004, Хайнс, 8:00",
#     "CS102": "CS102: 4501, Альварадо, 9:00",
#     "CS103": "CS103: 6755, Рич, 10:00",
#     "NT110": "NT110: 1244, Берк, 11:00",
#     "CM241": "CM241: 1411, Ли, 13:00"
# }
# print(f'{d[input()]}')

# courses = {
#     "CS101": (3004, 'Хайнс', '8:00'),
#     "CS102": (4501, 'Альварадо', '9:00'),
#     "CS103": (6755, 'Рич', '10:00'),
#     "NT110": (1244, 'Берк', '11:00'),
#     "CM241": (1411, 'Ли', '13:00')
# }
#
# s = input()
# print('{}: {}, {}, {}'.format(s, *courses[s]))


# Class = {"CS101": "CS101: 3004, Хайнс, 8:00", "CS102": "CS102: 4501, Альварадо, 9:00", "CS103": "CS103: 6755, Рич, 10:00","NT110": "NT110: 1244, Берк, 11:00","CM241": "CM241: 1411, Ли, 13:00"}
#
# print(Class[input()])

# d = {
#     "CS101": "3004, Хайнс, 8:00",
#     "CS102": "4501, Альварадо, 9:00",
#     "CS103": "6755, Рич, 10:00",
#     "NT110": "1244, Берк, 11:00",
#     "CM241": "1411, Ли, 13:00"
# }
# s = input()
# print(f'{s}: {d[s]}')


# d={".":'1', ",":'11', "?":'111', "!":'1111', ":":'11111',
#     "A":'2', "B":'22', "C":'222',
#     "D":'3', "E":'33', "F":'333',
#     "G":'4', "H":'44', "I":'444',
#     "J":'5', "K":'55', "L":'555',
#     "M":'6', "N":'66', "O":'666',
#     "P":'7', "Q":'77', "R":'777', "S": '7777',
#     "T":'8', "U":'88', "V":'888',
#     "W":'9', "X":'99', "Y":'999', "Z": '9999',
#     " ":'0'
# }
# print(*[d[(c.upper())] for c in input()])

'''Набор сообщений
На мобильных кнопочных телефонах текстовые сообщения можно отправлять с помощью цифровой клавиатуры. Поскольку с 
каждой клавишей связано несколько букв, для большинства букв требуется несколько нажатий клавиш. При однократном 
нажатии цифры генерируется первый символ, указанный для этой клавиши. Нажатие цифры 2, 3, 42,3,4 или 55 раз генерирует 
второй, третий, четвертый или пятый символ клавиши.

1	.,?!:
2	ABC
3	DEF
4	GHI
5	JKL
6	MNO
7	PQRS
8	TUV
9	WXYZ
0	space (пробел)
Напишите программу, которая отображает нажатия клавиш, необходимые для введенного сообщения.

Формат входных данных
На вход программе подается одна строка – текстовое сообщение.

Формат выходных данных
Программа должна вывести нажатия клавиш, необходимых для введенного сообщения.

Примечание 1. Ваша программа должна обрабатывать как прописные, так и строчные буквы.

Примечание 2. Ваша программа должна игнорировать любые символы, не указанные в приведенной выше таблице.

Примечание 3. Nokia 3310, чтобы вспомнить как это было 😄



Подсказка
Создайте словарь, в котором каждая буква или символ сопоставляется с нажатиями клавиш, необходимыми для их создания. 

Sample Input 1:

Hello, World!
Sample Output 1:

4433555555666110966677755531111
Sample Input 2:

He said: "I can solve this problem".
Sample Output 2:

44330777724443111110444022226607777666555888330844444777707777666225553361
Sample Input 3:

Bee   Geek!!!
Sample Output 3:

2233330004333355111111111111'''

# number = input()
# def Numbers_To_Words (number):
#     d={".":'1', ",":'11', "?":'111', "!":'1111', ":":'11111',
#         "A":'2', "B":'22', "C":'222',
#         "D":'3', "E":'33', "F":'333',
#         "G":'4', "H":'44', "I":'444',
#         "J":'5', "K":'55', "L":'555',
#         "M":'6', "N":'66', "O":'666',
#         "P":'7', "Q":'77', "R":'777', "S": '7777',
#         "T":'8', "U":'88', "V":'888',
#         "W":'9', "X":'99', "Y":'999', "Z": '9999',
#         " ":'0'
#     }
#     return ''.join(map(lambda x: d[x], str(number.replace('"','').upper())))
#
# print(Numbers_To_Words(number))

# nokia = {'1': '.,?!:', '2': 'ABC', '3': 'DEF', '4': 'GHI', '5': 'JKL', '6': 'MNO', '7': 'PQRS', '8': 'TUV', '9': 'WXYZ', '0': ' '}
# s = input().upper()
# for i in s:
#     for key, val in nokia.items():
#         if i in val:
#             for _ in range(val.find(i) + 1):
#                 print(key, end='')

# d = {".": '1', ",": '11', "?": '111', "!": '1111', ":": '11111',
#      "A": '2', "B": '22', "C": '222',
#      "D": '3', "E": '33', "F": '333',
#      "G": '4', "H": '44', "I": '444',
#      "J": '5', "K": '55', "L": '555',
#      "M": '6', "N": '66', "O": '666',
#      "P": '7', "Q": '77', "R": '777', "S": '7777',
#      "T": '8', "U": '88', "V": '888',
#      "W": '9', "X": '99', "Y": '999', "Z": '9999',
#      " ": '0'
#      }
# result = (d[letter.upper()] for letter in input() if letter.upper() in d.keys())
# print(*result, sep='')


'''Дополните приведенный код, чтобы он вывел имена всех пользователей (в алфавитном порядке), чей номер оканчивается
 на 8.

Примечание. Имена необходимо вывести на одной строке, разделяя символом пробела.'''

import operator
# users =[{'name': 'Todd', 'phone': '551-1414', 'email': 'todd@gmail.com'},
#          {'name': 'Helga', 'phone': '555-1618', 'email': 'helga@mail.net'},
#          {'name': 'Olivia', 'phone': '449-3141', 'email': ''},
#          {'name': 'LJ', 'phone': '555-2718', 'email': 'lj@gmail.net'},
#          {'name': 'Ruslan', 'phone': '422-145-9098', 'email': 'rus-lan.cha@yandex.ru'},
#          {'name': 'John', 'phone': '233-421-32', 'email': ''},
#          {'name': 'Lara', 'phone': '+7998-676-2532', 'email': 'g.lara89@gmail.com'},
#          {'name': 'Alina', 'phone': '+7948-799-2434', 'email': 'ali.ch.b@gmail.com'},
#          {'name': 'Robert', 'phone': '420-2011', 'email': ''},
#          {'name': 'Riyad', 'phone': '128-8890-128', 'email': 'r.mahrez@mail.net'},
#          {'name': 'Khabib', 'phone': '+7995-600-9080', 'email': 'kh.nurmag@gmail.com'},
#          {'name': 'Olga', 'phone': '6449-314-1213', 'email': ''},
#          {'name': 'Roman', 'phone': '+7459-145-8059', 'email': 'roma988@mail.ru'},
#          {'name': 'Maria', 'phone': '12-129-3148', 'email': 'm.sharapova@gmail.com'},
#          {'name': 'Fedor', 'phone': '+7445-341-0545', 'email': ''},
#          {'name': 'Tim', 'phone': '242-449-3141', 'email': 'timm.ggg@yandex.ru'}]

# sorted_x = sorted(users, key=operator.itemgetter('name'))
# for key in sorted_x:
#     if key['phone'][-1]=='8':
#        print(key['name'],end=' ',sep='')


# print(*sorted([x['name'] for x in users if x['phone'][-1] == '8']))


# for user in sorted(users, key=lambda x: x['name']):
#     if user['phone'].endswith('8'):
#         print(user['name'], end=' ')


# a=[]
# for i in users:
#     if i['phone'][-1]=='8':
#         a.append(i['name'])
# print(*sorted(a))

#

'''Дополните приведенный код, чтобы он вывел имена всех пользователей (в алфавитном порядке), у которых нет 
информации об электронной почте. 

Примечание 1. Ключ email может отсутствовать в словаре.

Примечание 2. Имена необходимо вывести на одной строке, разделяя символом пробела.'''

users = [{'name': 'Todd', 'phone': '551-1414', 'email': 'todd@gmail.com'},
         {'name': 'Helga', 'phone': '555-1618'},
         {'name': 'Olivia', 'phone': '449-3141', 'email': ''},
         {'name': 'LJ', 'phone': '555-2718', 'email': 'lj@gmail.net'},
         {'name': 'Ruslan', 'phone': '422-145-9098', 'email': 'rus-lan.cha@yandex.ru'},
         {'name': 'John', 'phone': '233-421-32', 'email': ''},
         {'name': 'Lara', 'phone': '+7998-676-2532', 'email': 'g.lara89@gmail.com'},
         {'name': 'Alina', 'phone': '+7948-799-2434'},
         {'name': 'Robert', 'phone': '420-2011', 'email': ''},
         {'name': 'Riyad', 'phone': '128-8890-128', 'email': 'r.mahrez@mail.net'},
         {'name': 'Khabib', 'phone': '+7995-600-9080', 'email': 'kh.nurmag@gmail.com'},
         {'name': 'Olga', 'phone': '6449-314-1213', 'email': ''},
         {'name': 'Roman', 'phone': '+7459-145-8059'},
         {'name': 'Maria', 'phone': '12-129-3148', 'email': 'm.sharapova@gmail.com'},
         {'name': 'Fedor', 'phone': '+7445-341-0545', 'email': ''},
         {'name': 'Tim', 'phone': '242-449-3141', 'email': 'timm.ggg@yandex.ru'}]

# a=[]
# for i in users:
#     if  (len(i)>2 and i['email']=='') or len(i)==2:
#         a.append(i['name'])
# print(*sorted(a))

# print(*sorted([k['name'] for k in users if 'email' not in k or k['email'] == '']))

print(*sorted( [ dc['name'] for dc in users if dc.get('email', '') == '' ] ))



'''Код Морзе
Код Морзе для представления цифр и букв использует тире и точки.

Напишите программу для кодирования текстового сообщения в соответствии с кодом Морзе.

Символ	Код	Символ	Код	Символ	Код	Символ	Код
A	.-	J	.---	S	...	1	.----
B	-...	K	-.-	T	-	2	..---
C	-.-.	L	.-..	U	..-	3	...--
D	-..	M	--	V	...-	4	....-
E	.	N	-.	W	.--	5	.....
F	..-.	O	---	X	-..-	6	-....
G	--.	P	.--.	Y	-.--	7	--...
H	....	Q	--.-	Z	--..	8	---..
I	..	R	.-.	0	-----	9	----.
Формат входных данных
На вход программе подается одна строка – текстовое сообщение.

Формат выходных данных
Программа должна вывести закодированное с помощью кода Морзе сообщение, оставляя пробел между каждым закодированным
 символом (последовательностью тире и точек).

Примечание 1. Ваша программа должна игнорировать любые символы, не перечисленные в таблице.

Примечание 2. Код Морзе был разработан в XIX веке и все еще используется, спустя более 160160 лет после создания.

Sample Input 1:

Interstellar
Sample Output 1:

.. -. - . .-. ... - . .-.. .-.. .- .-.
Sample Input 2:'''

# letters = [c for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789']
# morse = ['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..', '-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...', '---..', '----.']
#
# info = dict(zip(letters, morse))
# text=input().upper().replace(' ','')
# for c in ',/.!?+=-':
#     text = text.replace(c, '')
# print(' '.join(info[j] for j in text), end=' ')


# letters = [c for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789']
# morse = ['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..', '-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...', '---..', '----.']
#
# for key in input().upper():
#     if key in letters:
#         print(morse[letters.index(key)], end=' ')

