Урок 6 из 8 · 25 мин · обновлено
Списки и словари
Как хранить много значений сразу: списки для упорядоченных наборов, словари для пар «ключ — значение» и главные методы для работы с ними.
Список
До сих пор каждая переменная хранила одно значение. Но часто их много: товары в корзине, задачи на день, оценки ученика. Для этого есть список — упорядоченный набор значений в квадратных скобках:
tasks = ["купить хлеб", "позвонить маме", "оплатить интернет"]
print(tasks[0]) # купить хлеб — нумерация с нуля, как у строк
print(tasks[-1]) # оплатить интернет
print(len(tasks)) # 3
Список удобно перебирать циклом for:
for task in tasks:
print("—", task)
Главные методы списков
В отличие от строк, список можно менять:
tasks.append("сходить в зал") # добавить в конец
tasks.remove("купить хлеб") # удалить по значению
first = tasks.pop(0) # удалить по индексу и вернуть элемент
tasks.sort() # отсортировать по алфавиту
Проверить, есть ли значение в списке, помогает оператор in:
if "позвонить маме" in tasks:
print("Не забудьте позвонить")
Со списками чисел работают встроенные функции: sum(), min(), max().
prices = [450, 150, 300]
print(sum(prices)) # 900
print(max(prices)) # 450
Словарь
Иногда важен не порядок, а быстрый поиск по названию. Например, цена товара по его имени. Для этого есть словарь — набор пар «ключ — значение» в фигурных скобках:
prices = {"пицца": 450, "морс": 150, "салат": 300}
print(prices["пицца"]) # 450
Работа со словарём:
prices["кофе"] = 200 # добавить новую пару
prices["пицца"] = 490 # изменить значение
del prices["салат"] # удалить пару
print(prices.get("чай")) # None — такого ключа нет
print("морс" in prices) # True — проверка наличия ключа
Обратиться к несуществующему ключу через квадратные скобки — ошибка KeyError. Поэтому, если ключа может не быть, используйте get().
Перебрать словарь можно сразу по парам с помощью метода items():
for item, price in prices.items():
print(f"{item}: {price} ₽")
Список или словарь
| Задача | Что выбрать |
|---|---|
| Важен порядок: очередь, история, шаги | список |
| Нужно найти значение по названию | словарь |
| Много однотипных объектов с полями | список словарей |
Последний вариант встречается постоянно — так выглядят данные почти в любом приложении:
order = [
{"item": "пицца", "price": 450, "count": 2},
{"item": "морс", "price": 150, "count": 1},
]
total = 0
for line in order:
total += line["price"] * line["count"]
print(f"Итого: {total} ₽") # Итого: 1050 ₽
Попробуйте сами. Есть меню menu = {"чай": 120, "кофе": 200, "круассан": 180} и список покупок cart = ["кофе", "круассан", "чай", "кофе"]. Посчитайте стоимость корзины. Если товара нет в меню, выведите предупреждение.
Решение
menu = {"чай": 120, "кофе": 200, "круассан": 180}
cart = ["кофе", "круассан", "чай", "кофе"]
total = 0
for item in cart:
if item in menu:
total += menu[item]
else:
print(f"«{item}» нет в меню")
print(f"К оплате: {total} ₽") # К оплате: 700 ₽
Здесь вместе работает всё, что вы уже знаете: цикл перебирает список, условие проверяет ключ, словарь подсказывает цену.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Что будет в списке после tasks = ['почта']; tasks.append('звонок')?
append() добавляет элемент в конец списка и меняет сам список.
-
Словарь prices = {'чай': 120}. Что вернёт prices.get('кофе')?
get() возвращает None, если ключа нет. Обращение prices['кофе'] в такой ситуации вызвало бы ошибку.
-
Нужно хранить телефоны друзей и быстро находить номер по имени. Что подойдёт лучше?
Словарь находит значение по ключу сразу. В списке пришлось бы перебирать элементы, чтобы найти нужный.
-
Что делает tasks.pop(0)?
pop() удаляет элемент по индексу и возвращает его, чтобы можно было с ним что-то сделать. Без индекса pop() удаляет последний элемент.