Что нужно знать перед задачами на списки
Перед задачами на списки достаточно 4 вещей: список хранит элементы по порядку, нумерация начинается с 0, длину возвращает len, а новый элемент добавляет append. Остальное можно подсмотреть в памятке ниже.
Список в Python — это упорядоченный набор значений в квадратных скобках: [3, 9, 4]. У каждого элемента есть номер, или индекс. Первый элемент имеет индекс 0, второй — 1, а последний можно получить через отрицательный индекс −1. В отличие от строки, список можно менять: заменять элементы, добавлять новые и удалять старые.
В школьной программе списки соответствуют одномерным массивам. По федеральной образовательной программе основного общего образования их изучают в 9 классе после циклов и ветвлений[1], и типовые алгоритмы там те же, что в этом наборе: поиск максимума, подсчёт элементов с условием, суммирование. Если ученик пишет на Python, вместо массива он использует список — запись короче, а идеи совпадают.
Набор построен так, что каждая следующая задача добавляет один новый приём. Сначала перебор с «чемпионом», потом встроенные функции sum и len, затем сборка нового списка через append, срезы, подсчёт, двойной проход, склейка и проверка через in. Решив все восемь задач со списками, ученик знает почти весь базовый набор операций.
Как работать с тренажёром: выберите номер задачи, прочитайте условие и пример, допишите решение под заготовкой и нажмите «✓ Проверить». Программа запустит код на нескольких списках, в том числе из одного элемента и с отрицательными элементами. Если тест не пройден, справа видно, какой список подавался и что ожидалось. По материалам ФИПИ в ОГЭ по информатике задание 16 — программа на универсальном языке, и обработка последовательности чисел там встречается постоянно[2]. Через пару дней решите те же задачи на списки ещё раз без подсказок: исследование Roediger и Karpicke показало, что самопроверка закрепляет знания лучше перечитывания[3].
Как прочитать список из одной строки
Во всех 8 задачах числа вводятся в одной строке через пробел. Чтобы превратить такую строку в список целых чисел, хватает одной строки кода.
line = "3 9 4"
parts = line.split()
nums = [int(x) for x in parts]
print(nums)
[3, 9, 4]
Метод split() режет строку по пробелам и возвращает список строк ['3', '9', '4']. Но строки нельзя сравнивать как числа: '9' > '10' окажется истинным, потому что сравнение идёт по символам. Поэтому каждый кусок превращают в int. Запись в квадратных скобках с for внутри называется генератором списка; в заготовке тренажёра она уже есть, и разбирать её подробно на старте не обязательно. Как работает split и другие методы строк, объясняет официальная документация Python[4].
Памятка: операции со списком
Для этого набора нужны 9 операций из таблицы. Всё остальное, что умеют списки, пригодится позже.
| Запись | Что делает | Для [3, 9, 4] |
nums[0] | первый элемент | 3 |
nums[-1] | последний элемент | 4 |
len(nums) | количество элементов | 3 |
sum(nums) | сумма | 16 |
nums.append(7) | добавить в конец | [3, 9, 4, 7] |
nums[::-1] | новый список задом наперёд | [4, 9, 3] |
nums[:-1] | всё, кроме последнего | [3, 9] |
9 in nums | есть ли значение | True |
nums.count(9) | сколько раз встречается | 1 |
Для вывода через пробел удобна запись ' '.join(...), но она склеивает только строки. Поэтому числа перед склейкой превращают в текст: ' '.join([str(x) for x in nums]). Есть и короткий путь — print(*nums): звёздочка раскладывает элементы по отдельным аргументам print.
Разбор: максимум и второе по величине
Максимум ищут приёмом «чемпиона»: первый элемент объявляется лучшим, а каждый следующий сравнивается с ним. Второе по величине требует ещё одного прохода по списку.
nums = [3, 9, 4, 9]
big = max(nums)
second = None
for x in nums:
if x != big and (second is None or x > second):
second = x
print(second)
Почему не взять просто sorted(nums)[-2]? Для списка 3, 9, 4, 9 результат будет 9: максимум встречается дважды. Условие задачи требует другое значение, поэтому равные максимуму пропускаются. Значение None означает «пока никого не нашли» — так не нужно гадать, каким числом заполнить переменную в начале, если все элементы отрицательные. Если хочется увидеть, как работает сортировка изнутри, загляните в статью про алгоритмы сортировки пузырьком и выбором.
Разбор: среднее и отбор по условию
Среднее арифметическое — это сумма, делённая на количество: sum(nums) / len(nums). Для вывода с 2 знаками после точки подходит запись f'{avg:.2f}'.
Отбор по условию строится по схеме «пустой список — перебор — append». Создаём even = [], перебираем исходные данные и добавляем только подходящие элементы. Тот же шаблон отбирает положительные числа, слова длиннее пяти букв или оценки выше тройки. Важно, что исходные данные при этом не меняются: мы собираем новый набор, а не удаляем лишнее из старого. Удалять элементы во время перебора опасно — индексы сдвигаются, и часть значений пропускается.
Задачи на списки со срезами
Срез — это способ взять часть последовательности по индексам: nums[a:b] берёт элементы с номера a до b, не включая b. Три задачи набора решаются срезами в 1–2 строки.
Разворот — nums[::-1]: шаг −1 идёт от конца к началу. Сдвиг вправо по кругу — [nums[-1]] + nums[:-1]: последний элемент, завёрнутый в список, плюс все остальные. Обратите внимание на квадратные скобки вокруг nums[-1]: через + склеиваются только объекты одного типа, а не число с набором. Удаление повторов срезом не решить, там нужна новая копилка и проверка if x not in unique. Для больших данных это медленно, но для учебных данных скорость не важна.
Когда список не нужен
Если значения не требуется хранить, отдельная структура не нужна: например, для суммы введённых чисел хватит одной переменной-накопителя. Вот 4 случая, когда этот набор не подходит.
- Ученик пока не решил 8 упражнений на циклы. Без уверенного for перебор элементов будет непонятен.
- Нужно найти сумму 1000 чисел, вводимых по одному. Хранить их незачем — достаточно накопителя.
- Нужно хранить пары «имя — 5 баллов». Для таких связей удобнее словарь, а не набор чисел.
- Ребёнку 9–10 лет и он работает в Scratch. Там есть свои блоки для хранения данных, и начать с них проще.
«Индексы в Python начинаются с единицы, как в обычной жизни». Это миф: первый элемент имеет индекс 0. Обращение к
nums[len(nums)]заканчивается ошибкой, о которой подробно рассказано на странице про ошибку IndexError.
«Запись b = a создаёт копию». Не подтверждается: обе переменные указывают на один и тот же объект, и append через b изменит и a. Копию даёт срез
a[:]или метод copy().
Чего делать нельзя
Нельзя обращаться к элементу, не проверив, что такой индекс существует: пустой набор не имеет даже первого элемента. Ещё шесть правил:
- Нельзя называть переменную list — так затирается встроенная функция, и
list(...)перестанет работать. - Не следует удалять элементы из того же набора, который сейчас перебирает for.
- Не стоит делить на len(nums), не проверив, что список не пуст, — получится ZeroDivisionError.
- Не стоит сравнивать числа, оставленные строками: '9' окажется больше '10'.
- Не допускается склеивать через join числа без str — Python остановится с TypeError.
- Нельзя ждать, что срез включит правую границу:
nums[0:2]даёт два элемента, а не три.
Полная теория с методами insert, remove, pop и sort — в статье о списках в Python. Следующий шаг после этого набора — задачи на строки: строка тоже последовательность, и многие приёмы переносятся туда без изменений. Руководство PEP 8 советует писать имена переменных строчными буквами с подчёркиванием, например even_numbers[5]. А множественное число в имени вроде nums или names — полезная договорённость: из кода сразу видно, где одно значение, а где много.
Источники
[1] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».
[2] ФИПИ. Методические рекомендации для обучающихся по организации индивидуальной подготовки к ОГЭ 2026 года. Информатика. М., 2026.
[3] Roediger H. L., Karpicke J. D. Test-enhanced learning: Taking memory tests improves long-term retention // Psychological Science. 2006. Vol. 17, № 3. P. 249–255.
[4] The Python Tutorial (официальная документация Python 3). Python Software Foundation.
[5] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.
Вопросы и ответы
Чем список отличается от массива?
В школьных языках массив обычно хранит значения одного типа и имеет фиксированную длину. В Python такая структура может расти и хранить разные типы, но в учебных упражнениях её используют как массив.
Почему print(nums) выводит скобки и запятые?
Так Python показывает весь объект целиком. Чтобы получить числа через пробел, используйте print(*nums) или join.
Можно ли решать задачи готовыми функциями max и sorted?
В жизни — да, и это правильно. В учебных упражнениях иногда просят обойтись без них, чтобы понять, как устроен поиск внутри.
Что вернёт срез за пределами длины?
Срез не вызывает ошибку: для [3, 9] запись [1:10] вернёт [9]. Ошибку даёт только обращение к одному несуществующему индексу.
Как ввести числа по одному в строке?
Сначала прочитайте количество, затем в цикле вызывайте input и добавляйте каждое значение через append.
Пригодятся ли эти приёмы на экзамене?
Поиск максимума, подсчёт по условию и сумма — базовые алгоритмы обработки массивов, их проходят в 9 классе. На ОГЭ программу в задании 16 можно писать на Python.