Урок 6 из 8 · 25 мин · обновлено

Списки и словари

Как хранить много значений сразу: списки для упорядоченных наборов, словари для пар «ключ — значение» и главные методы для работы с ними.

Список

До сих пор каждая переменная хранила одно значение. Но часто их много: товары в корзине, задачи на день, оценки ученика. Для этого есть список — упорядоченный набор значений в квадратных скобках:

Python
tasks = ["купить хлеб", "позвонить маме", "оплатить интернет"]

print(tasks[0])     # купить хлеб — нумерация с нуля, как у строк
print(tasks[-1])    # оплатить интернет
print(len(tasks))   # 3

Список удобно перебирать циклом for:

Python
for task in tasks:
    print("—", task)

Главные методы списков

В отличие от строк, список можно менять:

Python
tasks.append("сходить в зал")   # добавить в конец
tasks.remove("купить хлеб")     # удалить по значению
first = tasks.pop(0)            # удалить по индексу и вернуть элемент
tasks.sort()                    # отсортировать по алфавиту

Проверить, есть ли значение в списке, помогает оператор in:

Python
if "позвонить маме" in tasks:
    print("Не забудьте позвонить")

Со списками чисел работают встроенные функции: sum(), min(), max().

Python
prices = [450, 150, 300]
print(sum(prices))   # 900
print(max(prices))   # 450

Словарь

Иногда важен не порядок, а быстрый поиск по названию. Например, цена товара по его имени. Для этого есть словарь — набор пар «ключ — значение» в фигурных скобках:

Python
prices = {"пицца": 450, "морс": 150, "салат": 300}

print(prices["пицца"])   # 450

Работа со словарём:

Python
prices["кофе"] = 200        # добавить новую пару
prices["пицца"] = 490       # изменить значение
del prices["салат"]         # удалить пару

print(prices.get("чай"))    # None — такого ключа нет
print("морс" in prices)     # True — проверка наличия ключа

Обратиться к несуществующему ключу через квадратные скобки — ошибка KeyError. Поэтому, если ключа может не быть, используйте get().

Перебрать словарь можно сразу по парам с помощью метода items():

Python
for item, price in prices.items():
    print(f"{item}: {price} ₽")

Список или словарь

Задача Что выбрать
Важен порядок: очередь, история, шаги список
Нужно найти значение по названию словарь
Много однотипных объектов с полями список словарей

Последний вариант встречается постоянно — так выглядят данные почти в любом приложении:

Python
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 = ["кофе", "круассан", "чай", "кофе"]. Посчитайте стоимость корзины. Если товара нет в меню, выведите предупреждение.

Решение
Python
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 ₽

Здесь вместе работает всё, что вы уже знаете: цикл перебирает список, условие проверяет ключ, словарь подсказывает цену.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Что будет в списке после tasks = ['почта']; tasks.append('звонок')?

  2. Словарь prices = {'чай': 120}. Что вернёт prices.get('кофе')?

  3. Нужно хранить телефоны друзей и быстро находить номер по имени. Что подойдёт лучше?

  4. Что делает tasks.pop(0)?