Главная Сборник задач

Урок 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))
Яблоко > Груша > Апельсин > 4

Операции со списками: Замена, Добавление и Удаление

Главная сила списков в том, что мы можем перестраивать их прямо во время работы программы.

А) Замена элемента (по индексу)

Чтобы заменить элемент, достаточно обратиться к его ячейке по индексу и записать туда новое значение через знак =:

items = ["Деревянный меч", "Щит", "Зелье"]

# Заменяем первый предмет (индекс 0) на новый
items[0] = "Алмазный меч"
print(items)
['Алмазный меч', 'Щит', 'Зелье']

Б) Добавление элементов: .append() и .insert()

 guests = ["Алексей", "Мария"]

# Добавляем в самый конец
guests.append("Максим")

# Вставляем на первое место (индекс 0)
guests.insert(0, "Анна")
print(guests)
['Анна', 'Алексей', 'Мария', 'Максим']

В) Удаление элементов: .remove(), .pop() и del

bag = ["Ключ", "Факел", "Камень", "Карта"]

# 1. Удаляем по точному названию
bag.remove("Камень")

# 2. Удаляем по индексу (удалит элемент с индексом 0 — "Ключ")
bag.pop(0)

print(bag)
['Факел', 'Карта']

Симодулятор: Конструктор списков (list)

Управляйте списком inventory с помощью кнопок ниже и следите, как меняются индексы элементов.

1. Добавление
2. Замена по индексу
3. Удаление
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)
[50, 20] > 150 > 10 > 50 > [10, 20, 30, 40, 50]

2. Кортежи (tuple) — бронированный список

Кортеж — это родной брат списка, но с одним важным отличием: он неизменяемый (immutable). После создания кортежа в него нельзя добавить новый элемент, нельзя ничего удалить и нельзя заменить значение по индексу.

Создается кортеж с помощью круглых скобок ( ):

# Координаты точки или настройки экрана (которые никто не должен случайно сломать)
resolution = (1920, 1080)

# Читать по индексу МОЖНО:
print(resolution[0])

# ❌ А менять НЕЛЬЗЯ! Следующая строка вызовет ошибку TypeError:
# resolution[0] = 1280
1920
💡 Зачем нужны кортежи, если есть списки?
1. Безопасность: Вы защищаете важные данные (например, дни недели, координаты или настройки) от случайного изменения.
2. Скорость и память: Кортежи весят меньше и работают в Python быстрее, чем списки.

3. Словари (dict) — поиск по ключу

В списках мы ищем данные по номеру ячейки (`0, 1, 2`). Но помнить, что под индексом `0` лежит имя, а под индексом `3` — телефон, очень неудобно. В словарях у каждого значения есть свое уникальное текстовое или числовое имя — ключ (key).

Словарь создается в фигурных скобках { }, где пары записываются через двоеточие: {ключ: значение}.

# Создаем карточку персонажа
hero = {
    "name": "Артур",
    "health": 100,
    "weapon": "Экскалибур"
}

# Получаем значение по ключу (в квадратных скобках пишем КЛЮЧ, а не индекс)
print(hero["name"])
print(hero["health"])
Артур > 100

Добавление, Замена и Удаление в словарях

В словарях добавление нового элемента и замена старого выглядят одинаково! Всё зависит от того, существует ли уже такой ключ в словаре:

prices = {"Яблоко": 100, "Хлеб": 50}

# 1. ЗАМЕНА (ключ "Хлеб" уже есть, меняем его цену)
prices["Хлеб"] = 60

# 2. ДОБАВЛЕНИЕ (ключа "Сыр" еще нет, он добавится в словарь)
prices["Сыр"] = 250

# 3. УДАЛЕНИЕ по ключу
prices.pop("Яблоко")

print(prices)
{'Хлеб': 60, 'Сыр': 250}

Симодулятор: База данных словаря (dict)

Попробуйте изменить существующий ключ (например, level) или придумать совершенно новый (например, armor).

player = {"name": "Рыцарь", "level": "5", "gold": "250"}

Перебор словаря в цикле и безопасный метод .get()

Если вы обратитесь к несуществующему ключу через квадратные скобки hero["mana"], программа аварийно остановится с ошибкой KeyError. Чтобы избежать поломки, проверяйте наличие ключа оператором in или используйте метод .get(ключ, запасное_значение).

grades = {"Математика": 5, "Физика": 4, "История": 5}

# Безопасное получение (не вызовет ошибку, если предмета нет)
print(grades.get("Химия", "Оценки пока нет"))

# Перебор всех пар (ключ и значение) с помощью метода .items()
for subject, mark in grades.items():
    print(f"Предмет: {subject} -> Оценка: {mark}")
Оценки пока нет > Предмет: Математика -> Оценка: 5 > Предмет: Физика -> Оценка: 4 > Предмет: История -> Оценка: 5

Итоговая шпаргалка по коллекциям

Коллекция Скобки Можно менять? Как обращаться к данным?
Список (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)
Разбор: Так как отсчет начинается с нуля (`0` — Математика, `1` — Физика, `2` — Физкультура), мы обращаемся к ячейке `lessons[2]` и присваиваем ей новое строковое значение.

Задача 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}")
Разбор: В Python любую коллекцию можно распаковать в отдельные переменные, если количество переменных слева от знака = точно совпадает с количеством элементов внутри кортежа.

Задача 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.

🧠 Проверь себя

Закрепим знания о списках, кортежах и словарях:

1. Какой индекс у самого первого и самого последнего элемента в списке?
Показать правильный ответ
У самого первого элемента индекс всегда 0, а к самому последнему можно обратиться по отрицательному индексу -1.
2. Чем отличаются методы списка .append() и .insert()?
Показать правильный ответ
Метод .append() всегда добавляет элемент строго в конец списка, а .insert(индекс, значение) позволяет вставить элемент в любое место списка по указанному индексу.
3. В чем главное отличие кортежа (tuple) от списка (list)?
Показать правильный ответ
Кортеж создается в круглых скобках () и является неизменяемым: после создания в него нельзя добавлять, удалять или менять элементы.
4. Что произойдет, если выполнить команду hero["gold"] = 500 для словаря, в котором уже был ключ "gold": 100?
Показать правильный ответ
Ключи в словаре уникальны, поэтому дубликат не создастся — старое значение 100 просто заменится (перезапишется) на новое значение 500.