Список — это когда у вас есть набор однотипных сущностей и вы хотите управлять ими как целым. Он держит порядок, даёт доступ по индексу, позволяет резать на части, переставлять элементы местами, сортировать и фильтровать.
Разберём всё на одном сюжете: таблица результатов хакатона.
Есть участники, у каждого:
- имя
- балл за проект
- время сдачи в минутах от старта (чем меньше — тем раньше)
Храним результаты как список, редактируем, делаем черновики, сортирует и отбираем лидеров.

Стартовые данные
Каждый участник — маленький список из трёх значений.
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-канал.
Там вы найдете анонсы обучающих статей и видео, готовый код для ваших проектов и увлекательные курсы. Ничего лишнего — только практика, вдохновение и развитие.
Берём элементы с индексами 1, 2, 3.
Каждый второй результат
Иногда нужно быстро посмотреть выборку «через один»:
every_second = results[::2]
Шаг 2 выбирает 0-й, 2-й, 4-й…
Копирование: делаем черновик
Часто надо попробовать перестановки, не ломая оригинал таблицы.
draft = results.copy()
или
draft = results[:]
Оба способа создают новый список.
Меняете draft — results остаётся неизменным.
Методы списка, которые реально нужны
Длина таблицы
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.
Практика на том же примере
Не меняя сюжет:
- Соберите топ-2 по баллам, но без сортировки всего списка: пройдитесь циклом, находя максимум два раза.
- Сделайте «лист ожидания»: отберите команды с баллом от 80 до 84 включительно.
- Пересчитайте время так, чтобы оно стало «время с конца» (например, если хакатон 360 минут): замените у каждой команды поле времени на 360 - time.
Если эти три задачи выходят спокойно — списки у вас как инструмент, а не как синтаксис.
05.12.2025
0
26
Комментарии
0