8 упражнений со списками: поиск, подсчёт, разворот и повторы

Практикумобновлено 07.10.20268 мин чтенияесть тренажёр

Задачи на списки начинаются там, где одной переменной уже мало: нужно сохранить много чисел и потом искать среди них наибольшее, считать среднее или отбирать подходящие. В тренажёре 8 упражнений с автопроверкой — от максимума без max до удаления повторов, — а ниже разобраны приёмы, которые повторяются почти в каждом решении.

Загружаем…

Что нужно знать перед задачами на списки

Перед задачами на списки достаточно 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.