Урок 14. Коллекции данных: Списки, Кортежи и Словари
Обычная переменная похожа на маленькую коробку, в которую помещается только один предмет. Но что, если нам нужно сохранить список из 30 учеников класса, инвентарь игрока или телефонный справочник? Создавать 30 отдельных переменных student1, student2 — неудобно. Для хранения множества значений в одной переменной в Python существуют коллекции (структуры данных).
1. Списки (list) — изменяемый ряд
Список — это упорядоченная коллекция элементов, которую можно свободно менять (добавлять, удалять и заменять внутри нее данные). Список создается с помощью квадратных скобок [ ], а элементы перечисляются через запятую.
Индексы: Нумерация с нуля!
Список похож на поезд с пронумерованными вагонами. Номер вагона называется индексом. В Python нумерация слева направо всегда начинается с 0. Также есть обратная нумерация справа налево: последний элемент всегда имеет индекс -1, предпоследний -2 и так далее.
# Создаем список покупок
fruits = ["Яблоко", "Банан", "Груша", "Апельсин"]
# Доступ по индексу
print(fruits[0]) # Выведет первый элемент (индекс 0)
print(fruits[2]) # Выведет третий элемент (индекс 2)
print(fruits[-1]) # Выведет самый последний элемент
# Узнаем длину списка (количество элементов) с помощью len()
print(len(fruits))
Операции со списками: Замена, Добавление и Удаление
Главная сила списков в том, что мы можем перестраивать их прямо во время работы программы.
А) Замена элемента (по индексу)
Чтобы заменить элемент, достаточно обратиться к его ячейке по индексу и записать туда новое значение через знак =:
items = ["Деревянный меч", "Щит", "Зелье"]
# Заменяем первый предмет (индекс 0) на новый
items[0] = "Алмазный меч"
print(items)
Б) Добавление элементов: .append() и .insert()
.append(значение)— добавляет один новый элемент строго в конец списка..insert(индекс, значение)— вставляет элемент на конкретную позицию (остальные элементы просто сдвигаются вправо).
guests = ["Алексей", "Мария"]
# Добавляем в самый конец
guests.append("Максим")
# Вставляем на первое место (индекс 0)
guests.insert(0, "Анна")
print(guests)
В) Удаление элементов: .remove(), .pop() и del
.remove(значение)— ищет элемент по названию (значению) и удаляет его. Если такого значения в списке нет, выдаст ошибку..pop(индекс)— удаляет элемент по его индексу. Если скобки оставить пустыми.pop(), удалится самый последний элемент..clear()— полностью очищает список, делая его пустым[].
bag = ["Ключ", "Факел", "Камень", "Карта"]
# 1. Удаляем по точному названию
bag.remove("Камень")
# 2. Удаляем по индексу (удалит элемент с индексом 0 — "Ключ")
bag.pop(0)
print(bag)
Симодулятор: Конструктор списков (list)
Управляйте списком inventory с помощью кнопок ниже и следите, как меняются индексы элементов.
Срезы (Slicing) и полезные функции
Мы можем отрезать от списка целый кусочек (подсписок) с помощью двоеточия: список[старт:стоп]. Как и в функции range(), граница стоп не включается!
nums = [10, 50, 20, 40, 30]
# Срез со 1-го по 3-й индекс (3 не включается)
print(nums[1:3])
# Встроенные математические функции для числовых списков:
print(sum(nums)) # Сумма всех чисел
print(min(nums)) # Самое маленькое число
print(max(nums)) # Самое большое число
# Сортировка списка по возрастанию
nums.sort()
print(nums)
2. Кортежи (tuple) — бронированный список
Кортеж — это родной брат списка, но с одним важным отличием: он неизменяемый (immutable). После создания кортежа в него нельзя добавить новый элемент, нельзя ничего удалить и нельзя заменить значение по индексу.
Создается кортеж с помощью круглых скобок ( ):
# Координаты точки или настройки экрана (которые никто не должен случайно сломать)
resolution = (1920, 1080)
# Читать по индексу МОЖНО:
print(resolution[0])
# ❌ А менять НЕЛЬЗЯ! Следующая строка вызовет ошибку TypeError:
# resolution[0] = 1280
1. Безопасность: Вы защищаете важные данные (например, дни недели, координаты или настройки) от случайного изменения.
2. Скорость и память: Кортежи весят меньше и работают в Python быстрее, чем списки.
3. Словари (dict) — поиск по ключу
В списках мы ищем данные по номеру ячейки (`0, 1, 2`). Но помнить, что под индексом `0` лежит имя, а под индексом `3` — телефон, очень неудобно. В словарях у каждого значения есть свое уникальное текстовое или числовое имя — ключ (key).
Словарь создается в фигурных скобках { }, где пары записываются через двоеточие: {ключ: значение}.
# Создаем карточку персонажа
hero = {
"name": "Артур",
"health": 100,
"weapon": "Экскалибур"
}
# Получаем значение по ключу (в квадратных скобках пишем КЛЮЧ, а не индекс)
print(hero["name"])
print(hero["health"])
Добавление, Замена и Удаление в словарях
В словарях добавление нового элемента и замена старого выглядят одинаково! Всё зависит от того, существует ли уже такой ключ в словаре:
- Если ключа еще нет — команда
словарь[ключ] = значениесоздаст новую пару. - Если ключ уже есть — команда
словарь[ключ] = значениеперезапишет старое значение. - Для удаления пары используется метод
.pop(ключ)или операторdel словарь[ключ].
prices = {"Яблоко": 100, "Хлеб": 50}
# 1. ЗАМЕНА (ключ "Хлеб" уже есть, меняем его цену)
prices["Хлеб"] = 60
# 2. ДОБАВЛЕНИЕ (ключа "Сыр" еще нет, он добавится в словарь)
prices["Сыр"] = 250
# 3. УДАЛЕНИЕ по ключу
prices.pop("Яблоко")
print(prices)
Симодулятор: База данных словаря (dict)
Попробуйте изменить существующий ключ (например, level) или придумать совершенно новый (например, armor).
Перебор словаря в цикле и безопасный метод .get()
Если вы обратитесь к несуществующему ключу через квадратные скобки hero["mana"], программа аварийно остановится с ошибкой KeyError. Чтобы избежать поломки, проверяйте наличие ключа оператором in или используйте метод .get(ключ, запасное_значение).
grades = {"Математика": 5, "Физика": 4, "История": 5}
# Безопасное получение (не вызовет ошибку, если предмета нет)
print(grades.get("Химия", "Оценки пока нет"))
# Перебор всех пар (ключ и значение) с помощью метода .items()
for subject, mark in grades.items():
print(f"Предмет: {subject} -> Оценка: {mark}")
Итоговая шпаргалка по коллекциям
| Коллекция | Скобки | Можно менять? | Как обращаться к данным? |
|---|---|---|---|
Список (list) |
Квадратные [10, 20] |
✅ Да (добавлять, удалять, менять) | По числовому индексу: data[0] |
Кортеж (tuple) |
Круглые (10, 20) |
❌ Нет (неизменяемый) | По числовому индексу: data[0] |
Словарь (dict) |
Фигурные {"a": 10} |
✅ Да (по ключу) | По уникальному ключу: data["a"] |
4. Практика: 10 задач с разбором
Попробуйте решить эти задачи самостоятельно, а затем откройте спойлер, чтобы проверить решение и прочитать разбор.
Задача 1. Исправление расписания (Замена в списке)
Дан список уроков: lessons = ["Математика", "Физика", "Физкультура", "История"]. Физкультуру отменили и поставили вместо нее «Информатику». Замените элемент по индексу и выведите обновленный список.
Показать решение и разбор
lessons = ["Математика", "Физика", "Физкультура", "История"]
# "Физкультура" находится на 3-м месте, значит её индекс равен 2
lessons[2] = "Информатика"
print(lessons)
Задача 2. Управление корзиной (Добавление и удаление)
Создайте список cart = ["Молоко", "Хлеб", "Печенье"]. Пользователь передумал брать "Печенье" (удалите его по названию) и решил добавить в конец списка "Сыр" и "Яблоки". Выведите итоговую корзину.
Показать решение и разбор
cart = ["Молоко", "Хлеб", "Печенье"]
cart.remove("Печенье")
cart.append("Сыр")
cart.append("Яблоки")
print(cart)
.remove("Печенье") находит и удаляет элемент по его значению, а два вызова .append() по очереди добавляют новые продукты в конец списка.Задача 3. Аналитика температуры (min, max, sum, len)
Дан список температур за 5 дней: temps = [18, 22, 15, 25, 20]. Выведите самую низкую, самую высокую и среднюю температуру за эти дни.
Показать решение и разбор
temps = [18, 22, 15, 25, 20]
min_t = min(temps)
max_t = max(temps)
avg_t = sum(temps) / len(temps)
print(f"Минимум: {min_t}, Максимум: {max_t}, Средняя: {avg_t}")
sum(temps) на их количество len(temps).Задача 4. Сборка списка в цикле
Создайте пустой список movies = []. С помощью цикла for попросите пользователя ввести 3 любимых фильма и добавьте каждый в список. В конце выведите весь список.
Показать решение и разбор
movies = []
for i in range(3):
title = input("Введите название фильма: ")
movies.append(title)
print("Ваши любимые фильмы:", movies)
[], а внутри цикла каждый введенный пользователем ответ добавляется через .append().Задача 5. Фильтрация списка (Поиск больших чисел)
Дан список чисел: numbers = [4, 15, 8, 23, 42, 3, 19]. Переберите список циклом for и выведите на экран только те числа, которые больше 10.
Показать решение и разбор
numbers = [4, 15, 8, 23, 42, 3, 19]
for num in numbers:
if num > 10:
print(num)
for num in numbers: на каждом шаге достает из списка очередное число и кладет его в переменную num. Внутри цикла условие if отсеивает мелкие числа.Задача 6. Срезы и сортировка (Топ-3 игрока)
Даны очки участников турнира: scores = [45, 90, 12, 78, 105, 60]. Отсортируйте список по возрастанию и выведите с помощью среза три самых больших результата.
Показать решение и разбор
scores = [45, 90, 12, 78, 105, 60]
scores.sort()
# Три самых больших числа после сортировки окажутся в самом конце
print("Топ-3 результата:", scores[-3:])
.sort() выстраивает числа по порядку: [12, 45, 60, 78, 90, 105]. Срез scores[-3:] берет элементы, начиная с 3-го с конца и до самого последнего.Задача 7. Распаковка кортежа (Координаты)
Дан кортеж с координатами точки в 3D-пространстве: point = (15, -4, 80). Распакуйте его в три отдельные переменные x, y, z одной строкой и выведите их.
Показать решение и разбор
point = (15, -4, 80)
# Распаковка кортежа в три переменные
x, y, z = point
print(f"X = {x}, Y = {y}, Z = {z}")
= точно совпадает с количеством элементов внутри кортежа.Задача 8. Обновление профиля в словаре
Дан словарь: user = {"login": "alex_99", "level": 4}. Увеличьте уровень пользователя на 1, добавьте новый ключ "status": "online" и выведите словарь.
Показать решение и разбор
user = {"login": "alex_99", "level": 4}
# Изменяем существующий ключ
user["level"] += 1
# Добавляем новый ключ
user["status"] = "online"
print(user)
user["level"] += 1 берет текущее число по ключу "level" (4) и прибавляет к нему единицу. А обращение к несуществующему ключу user["status"] = "online" автоматически создает новую запись.Задача 9. Мини-переводчик (Проверка ключа в словаре)
Создайте словарь words = {"cat": "кошка", "dog": "собака", "bird": "птица"}. Пользователь вводит английское слово. Если оно есть в словаре, выведите перевод, иначе — «Слово не найдено».
Показать решение и разбор
words = {"cat": "кошка", "dog": "собака", "bird": "птица"}
query = input("Введите слово на английском: ").lower()
if query in words:
print(f"Перевод: {words[query]}")
else:
print("Слово не найдено")
if query in words: проверяет наличие ключа в словаре перед тем, как к нему обратиться. Также эту задачу можно решить в одну строчку через print(words.get(query, "Слово не найдено")).Задача 10. Подсчет чека по словарю
Дан словарь покупок с ценами: receipt = {"Хлеб": 50, "Молоко": 90, "Шоколад": 120, "Жвачка": 30}. Удалите из чека "Жвачку" с помощью .pop(), а затем посчитайте общую сумму оставшихся покупок циклом.
Показать решение и разбор
receipt = {"Хлеб": 50, "Молоко": 90, "Шоколад": 120, "Жвачка": 30}
# Удаляем жвачку по ключу
receipt.pop("Жвачка")
total = 0
for price in receipt.values():
total += price
print(f"Итого к оплате: {total} руб.")
.values() достает из словаря только значения (цены), что позволяет легко сложить их в переменную-копилку total.🧠 Проверь себя
Закрепим знания о списках, кортежах и словарях:
Показать правильный ответ
0, а к самому последнему можно обратиться по отрицательному индексу -1..append() и .insert()?
Показать правильный ответ
.append() всегда добавляет элемент строго в конец списка, а .insert(индекс, значение) позволяет вставить элемент в любое место списка по указанному индексу.tuple) от списка (list)?
Показать правильный ответ
() и является неизменяемым: после создания в него нельзя добавлять, удалять или менять элементы.hero["gold"] = 500 для словаря, в котором уже был ключ "gold": 100?
Показать правильный ответ
100 просто заменится (перезапишется) на новое значение 500.