Занятие № 8. Применение словарей для решения задач
Цель: научиться применять словари для решения задач.
Теория
Объявление словаря
Словарь (ассоциативный массив) – это набор ключей и соответствующих им значений. Данные в словаре не упорядочены. Словарь относится к изменяемым типам данных: можно добавлять новые значения и менять уже имеющиеся. В Python словарю соответствует тип dict.
Для описания словаря используются фигурные скобки:
d = {} # пустой словарьd =dict() # второй способ создать пустой словарь
В качестве примера опишем словарь eng2rus, который будет содержать перевод трёх слов с английского языка на русский. Внутри [] записывается новый ключ и затем присваивается значение. С помощью [<ключ>] можно получить значение, которое соответствует ключу:
1
2
3
4
5
6
7
eng2rus={}
eng2rus["one"]="один"
eng2rus["cat"]="кот"
eng2rus["mouse"]="мышь"
print(eng2rus)
print(eng2rus["cat"])# получаем значение по ключу "cat"
В последнем примере в словаре shop в качестве значений выступают списки. Если записать выражение shop["фрукты"][1], то в результате мы получим строку x"банан".
Вопрос 1 из 2
✔
Словарь - это неупорядоченная последовательность пар ключ-значение.
Верно. Порядок хранения ключей в словаре не обязательно совпадает с порядком их добавления.
Элементы словаря не упорядочены. В отличие от списков, пары ключ-значение в словаре не имеют порядкового номера.
✔
Что будет выведено на экран после выполнения следующего кода:
student = {"имя":"Павел", "возраст": 20, "отметка": 9}
# есть ли ключ "возраст" в словаре student
print("возраст" in student)
print("фамилия" in student)
print("отметка" not in student)
Методы класса dict
Класс dict содержит ряд методов для изменения словаря:
student = {"имя":"Павел", "возраст": 20, "отметка": 9}
print(student.get("фамилия"))
print(student.get("возраст"))
print(student.get("курс", 1)) # если ключа "курс" нет, вернуть 1
Когда ключа в словаре нет, метод get() вернёт значение None. В методе можно указать, какое значение возвращать, если ключ не существует. В случае со словарём student, результатом выражения student.get("отметка", 10) станет значение x?9.
✔
Что будет выведено на экран после выполнения следующего кода:
roman_nums = {'I':1, 'II':2, 'III':3, 'IV':4, 'V':5}
print(list(roman_nums.keys()))
for key in roman_nums.keys():
print(key, roman_nums[key])
Метод keys() возвращает последовательность ключей словаря. С помощью цикла перебираем данную последовательность. На каждой итерации цикла переменной key будет присваиваться очередной ключ. Обратите внимание, что ключи не обязательно перебираются в той же последовательности в какой они записаны в коде программы.
Вызов метода keys() можно пропустить. Цикл for по умолчанию будет перебирать ключи словаря:
Если слева от присваивания находится кортеж, и последовательность справа от = содержит столько же элементов что и кортеж, значения из последовательности распакуются в кортеж слева. Выше показан пример позиционного присваивания. Таким же образом можно распаковать значения из списка:
Создайте программу-переводчик, которая хранит перевод слов с русского языка на английский. После запуска программа выводит список слов в словаре и предлагает пользователю ввести слово для перевода. Если введенного слова нет в словаре выводится сообщение.
d = {
"молоко": "milk",
"хлеб": "bread",
"вода": "water"
}
print("Слова в словаре")
for key in d:
print(key)
word = input("Какое слово перевести? ")
if word in d:
print("Перевод:", d[word])
else:
print("Такого слова нет в словаре")
Слова и перевод хранятся в переменной типа dict под именем x?d. В этом словаре уже находятся x?три пары ключ-значение. С помощью цикла for выводим на экран список xключей словаря d. С помощью оператора xin проверяем, есть ли среди ключей словаря d введённое слово.
Пример № 2 (ex02.py)
Создайте программу для хранения оценок студентов. Пользователь вводит количество студентов, после чего вводит их имена, фамилии и отметка за экзамен. После этого программа выводит список студентов.
n = int(input("Введите количество студентов: "))
stud_list = []
for x in range(n):
student = {} # создаём пустой словарь
name = input("Имя: ")
last_name = input("Фамилия: ")
mark = float(input("Отметка за экзамен: "))
student.update({
"name": name,
"last_name": last_name,
"mark": mark
})
stud_list.append(student)
print("Список студентов")
for student in stud_list:
print(student)
В переменной с именем xstud_list будет храниться список студентов. Элементами списка будут словари. Информация о каждом студенте будет храниться в словаре, содержащем ключи name (имя), last_name (фамилия) и mark (отметка за экзамен).
Рисунок 2: Пример содержимого списка stud_list с двумя элементами
На каждом шаге цикла for создаём пустой словарь student. С помощью метода xupdate() заполняем словарь student введёнными с клавиатуры значениями. Метод xappend() добавит в конец списка ссылку на объект с информацией об очередном студенте.
Пример № 3 (ex03.py)
Пользователь вводит с клавиатуры строку с текстом. Программа должна подсчитать, сколько раз в тексте встречается каждое из слов. Слова в тексте разделяются пробелом, могут присутствовать знаки препинания (точка, запятая, знак вопроса, восклицательный знак).
text = input("Введите текст: ")
# приводим текст к малым буквам
text = text.lower()
# заменяем все знаки препинания на пробелы
for ch in '.,!?':
text = text.replace(ch, " ")
# получаем список слов
words = text.split()
counts = {} # пустой словарь
# перебираем все слова
for w in words:
if w in counts:
# если ключ w уже есть в словаре counts
counts[w] = counts[w] + 1
else:
# если ключа w пока нет в словаре counts
counts[w] = 1
"""
конструкцию if-else можно заменить
следующей строкой:
counts[w] = counts.get(w, 0) + 1
"""
# получаем список ключей словаря counts
# в котором будет храниться список уникальных слов
uWords = list(counts.keys())
# сортируем список слов
uWords.sort()
for w in uWords:
print(f"{w} - {counts[w]}")
Визуализация работы программы
За пошаговым выполнение программы можно проследить, перейдя по следующей ссылке. Обратите внимание, что данные уже введены заранее.
Задания для самостоятельной работы
Задание № 1 (sam01.py)
Программа содержит словарь, с набором товаров и стоимостью одной единицы данного товара. Пользователь вводит с клавиатуры название товара и его количество. Программа должна вывести на экран общую стоимость покупки.
Дополнительный плюс, если будет проверка наличия товара.
Шаблон программы:
# словарь с товарами и их ценамиgoods = {'тетрадь': 10,'ручка': 5,'карандаш': 4,'линейка': 3}# ваше решение задачи
Пример:
Название товара: карандаш
Количество: 10
Общая стоимость: 40 руб.
С помощью оператора in можно проверить, есть ли нужный ключ в словаре.
goods = {'тетрадь': 10, 'ручка': 5, 'карандаш': 4, 'линейка': 3}# вводим название товараg =input("Название товара: ")# вводим количествоnum =int(input("Количество: "))# проверяем, есть ли ключ в словареif g in goods:# считаем общую стоимостьtotal = num * goods[g]print("Общая стоимость:", total, "руб.")else:print("Такого товара нет")
Задание № 2 (sam02.py)
Напишите программу, которая создаёт словарь ключами которого являются числа от 1 до n включительно, а значением будет ключ возведённый в квадрат. n вводится с клавиатуры. Выведите полученный словарь на экран.
> 5
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Составьте решение из предложенных инструкций.
✔
nums = {}
col = int(input("> "))
for i in range(1, col + 1):
sq = i ** 2
nums[i] = sq
print(nums)
nums = {}
col =int(input("> "))
for i inrange(1, col +1):
nums[i] = sq
sq = i **2
print(nums)
В коде есть ошибка.
Задание № 3 (sam03.py)
Дан следующий словарь, представляющий инвентарь персонажа игры:
Проделайте следующие модификации со словарём inventory, используя операторы и методы классов dict и list:
добавьте ключ с названиемкарман; по ключу карман сохраните список, содержащий следующие строки: ‘ракушки’, ‘ягода’ и ‘платок’
отсортируйте список, хранящийся по ключу сумка
удалите ‘кинжал’ из списка, который хранится по ключу сумка
добавьте 50 к числу, которое хранится по ключу золото
С помощью функции print() выведите на экран обновлённый словарь inventory.
Задание № 4 (sam04.py)
Дополните второй пример таким образом, расчётом среднего балла за экзамен.
Задание № 5 (sam05.py)
Даны два словаря. Напишите программу, которая объединит эти словари. Если ключи встречаются в обоих исходных словарях, значения, которые хранятся по этим ключам складываются.