Список — это когда у вас есть набор однотипных сущностей и вы хотите управлять ими как целым. Он держит порядок, даёт доступ по индексу, позволяет резать на части, переставлять элементы местами, сортировать и фильтровать.

Разберём всё на одном сюжете: таблица результатов хакатона.
Есть участники, у каждого:

  • имя
  • балл за проект
  • время сдачи в минутах от старта (чем меньше — тем раньше)

Храним результаты как список, редактируем, делаем черновики, сортирует и отбираем лидеров.

Chatgpt image 5 дек. 2025 г., 17 25 54

Стартовые данные

Каждый участник — маленький список из трёх значений.

results = [
    ["team_red",   82, 310],
    ["team_blue",  90, 295],
    ["team_green", 76, 287],
    ["team_black", 90, 340],
]

Внутри одной записи:

  • item[0] — имя команды
  • item[1] — балл
  • item[2] — время сдачи

Индексация и чтение элементов

Список упорядоченный. Значит, можно обратиться к любому месту.

first_team = results[0]
last_team = results[-1]

print(first_team)
print(last_team)

results[-1] — последний элемент без подсчёта длины.

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

name = results[1][0]      # имя второй команды
score = results[1][1]     # её балл
submit_time = results[1][2]

print(name, score, submit_time)

Изменяем список результатов

Хакатон живой: команды добавляются, оценки меняются, кто-то вылетает.

Добавить новую запись в конец

results.append(["team_white", 88, 305])

append добавляет ровно один элемент в хвост.

Вставить запись по позиции

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

results.insert(2, ["team_yellow", 79, 300])

Вставка сдвигает всё правее на одну позицию.

Исправить запись

Например, организаторы пересчитали балл team_green и добавили 5 очков.

Сначала находим индекс (в реальном проекте вы бы искали по имени циклом, но пока вручную):

results[3][1] += 5

Если хотите заменить всю запись целиком:

results[3] = ["team_green", 81, 287]

Удалить запись

Три рабочих способа:

Удалить по индексу и получить удалённый элемент:

removed = results.pop(0)
print("Сняли:", removed[0])

Удалить по индексу без результата:

del results[1]

Удалить по значению (если запись совпадает полностью):

results.remove(["team_black", 90, 340])

Срезы: берём куски

Срез — это «дай часть списка». Он не меняет оригинал, а возвращает новый список.

Топ-3 команды по текущему порядку

top3_now = results[:3]

[:3] — от начала до индекса 3, не включая его.

Средний блок

middle = results[1:4]

📢 Подписывайтесь на наш Telegram-канал.

Там вы найдете анонсы обучающих статей и видео, готовый код для ваших проектов и увлекательные курсы. Ничего лишнего — только практика, вдохновение и развитие.

👉 https://t.me/codelab_channel

Берём элементы с индексами 1, 2, 3.

Каждый второй результат

Иногда нужно быстро посмотреть выборку «через один»:

every_second = results[::2]

Шаг 2 выбирает 0-й, 2-й, 4-й…

Копирование: делаем черновик

Часто надо попробовать перестановки, не ломая оригинал таблицы.

draft = results.copy()

или

draft = results[:]

Оба способа создают новый список.
Меняете draftresults остаётся неизменным.

Это поверхностная копия. Для простых списков чисел и строк этого достаточно.

Методы списка, которые реально нужны

Длина таблицы

print(len(results))

Развернуть порядок

Если хотите показать «от худших к лучшим» без сортировки:

results.reverse()

Меняет список на месте.

Сортировка по разным правилам

Список сортируется методом sort. Он меняет порядок внутри самого списка.

Сортировка по баллам

Балл находится во 2-м поле (item[1]).
Сделаем лидеров первыми:

draft = results.copy()
draft.sort(key=lambda item: item[1], reverse=True)

key= — по чему сравнивать элементы.
reverse=True — по убыванию.

После этого draft[0] — лучшая команда по баллам.

Сортировка по времени сдачи

Теперь другой критерий: быстрее сдали — выше.

draft = results.copy()
draft.sort(key=lambda item: item[2])

Без reverse, потому что меньшее время лучше.

Комбинированная сортировка: балл важнее времени

Реальный хакатон: сначала по баллам, а при равенстве — кто раньше сдал.

draft = results.copy()
draft.sort(key=lambda item: (-item[1], item[2]))

Тут трюк:

  • -item[1] делает сортировку по баллам убывающей
  • item[2] вторым критерием ставит время по возрастанию

Фильтрация: оставляем нужных

List comprehension — короткий способ отбирать элементы.

Команды, набравшие 85+ баллов

finalists = [item for item in results if item[1] >= 85]

Команды, сдавшие проект раньше 300-й минуты

fast_submitters = [item for item in results if item[2] < 300]

Фильтрация всегда возвращает новый список.

Собираем всё в реальный проход

results = [
    ["team_red",   82, 310],
    ["team_blue",  90, 295],
    ["team_green", 76, 287],
    ["team_black", 90, 340],
]

# добавили ещё одну команду
results.append(["team_white", 88, 305])

# сделали черновик для сортировки
draft = results.copy()

# финалисты: балл 85+
finalists = [item for item in draft if item[1] >= 85]

# отсортировали финалистов: балл ↓, время ↑
finalists.sort(key=lambda item: (-item[1], item[2]))

for name, score, t in finalists:
    print(f"{score:>3} pts | {t:>3} min | {name}")

Получаем компактную таблицу финалистов в правильном порядке — без дублирования логики.

Что должно остаться в голове

  • Список хранит элементы в порядке и даёт доступ по индексу.
  • Вы умеете:
    • создавать списки и вложенные списки,
    • читать и менять элементы по индексу,
    • добавлять (append, insert),
    • удалять (pop, del, remove),
    • резать срезами,
    • копировать для экспериментов,
    • сортировать по одному и нескольким критериям,
    • фильтровать через list comprehension.

Практика на том же примере

Не меняя сюжет:

  1. Соберите топ-2 по баллам, но без сортировки всего списка: пройдитесь циклом, находя максимум два раза.
  2. Сделайте «лист ожидания»: отберите команды с баллом от 80 до 84 включительно.
  3. Пересчитайте время так, чтобы оно стало «время с конца» (например, если хакатон 360 минут): замените у каждой команды поле времени на 360 - time.

Если эти три задачи выходят спокойно — списки у вас как инструмент, а не как синтаксис.