Python: уроки, справочник и задачи

Задачи на списки в Python с разбором решений

Раздел: Списки, кортежи и множества · Обновлено 31.10.2026

Задачи на списки Python помогают отработать базовые операции: подсчет, сортировку, срезы, поиск и удаление элементов. В подборке 16 упражнений от простых к более сложным, к каждому дано решение и пояснение, где чаще всего ошибаются. Перед практикой есть короткая шпаргалка по функциям и методам списка.

Списки Python
Фото: Spotting973 / CC BY-SA 2.0, Wikimedia Commons
Содержание статьи
  1. Шпаргалка перед решением задач
  2. Базовые задачи
  3. Поиск и изменение элементов
  4. Задачи посложнее
  5. Частые вопросы

Шпаргалка перед решением задач

Список (list) хранит упорядоченный набор любых объектов и может изменяться: элементы добавляются, удаляются и заменяются на месте. Индексация начинается с нуля, отрицательный индекс считает с конца: a[-1] вернет последний элемент.

ОперацияЗаписьИзменяет список
Длинаlen(a)нет
Сумма, минимум, максимумsum(a), min(a), max(a)нет
Добавить в конецa.append(x)да
Удалить по значениюa.remove(x)да
Удалить по индексуa.pop(i)да
Отсортироватьa.sort() / sorted(a)да / нет
Развернутьa.reverse() / a[::-1]да / нет
Найти индексa.index(x)нет

Полный перечень с примерами есть в статье про методы списка. Главное различие, которое нужно помнить: методы вроде sort() и reverse() меняют исходный список и возвращают None, а функции sorted() и срезы создают новый список.

Базовые задачи

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

Задача 1. Количество элементов

Дан список чисел. Выведите, сколько в нем элементов.

Решение:

my_list = [10, 20, 30, 40, 50]
print("Количество элементов:", len(my_list))
# Количество элементов: 5

Функция len() работает за постоянное время: длина хранится внутри объекта, перебора элементов нет.

Задача 2. Обратный порядок

Выведите элементы списка в обратном порядке, не изменяя исходный список.

Решение:

my_list = [1, 2, 3, 4, 5]
reversed_list = my_list[::-1]
print(reversed_list)  # [5, 4, 3, 2, 1]

Срез с шагом -1 создает копию. Если копия не нужна, вызовите my_list.reverse(). Как устроены срезы с шагом, подробно описано в статье про срезы.

Задача 3. Сумма элементов

Найдите сумму всех чисел списка.

Решение:

my_list = [5, 10, 15, 20]
print("Сумма:", sum(my_list))  # Сумма: 50

Задача 4. Максимум и минимум

Найдите наибольший и наименьший элементы списка.

Решение:

my_list = [15, 6, 27, 8, 12]
print("Максимум:", max(my_list))  # 27
print("Минимум:", min(my_list))   # 6

Для пустого списка обе функции выбросят ValueError. Чтобы этого избежать, передайте значение по умолчанию: max(my_list, default=None).

Задача 5. Удаление повторов

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

Решение:

my_list = [3, 1, 3, 2, 1, 5]
unique_list = list(dict.fromkeys(my_list))
print(unique_list)  # [3, 1, 2, 5]

Частый вариант list(set(my_list)) тоже убирает дубликаты, но порядок элементов после множества не гарантирован. Словарь сохраняет порядок вставки, поэтому dict.fromkeys() надежнее. Другие способы собраны в статье про удаление дубликатов из списка.

Задача 6. Сортировка

Отсортируйте список по возрастанию, затем по убыванию.

Решение:

my_list = [35, 17, 42, 11, 29]
print(sorted(my_list))                # [11, 17, 29, 35, 42]
print(sorted(my_list, reverse=True))  # [42, 35, 29, 17, 11]

Поиск и изменение элементов

В этих задачах нужно учитывать ситуацию, когда искомого элемента нет. Многие методы списка в таком случае выбрасывают исключение.

Задача 7. Объединение двух списков

Соедините два списка в один новый.

Решение:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2
print(combined)  # [1, 2, 3, 4, 5, 6]

Оператор + создает новый список. Метод list1.extend(list2) дописывает элементы в существующий и ничего не возвращает.

Задача 8. Индекс элемента

Найдите индекс первого вхождения заданного значения. Если значения нет, выведите -1.

Решение:

my_list = [10, 20, 30, 40, 50]
element = 30
index = my_list.index(element) if element in my_list else -1
print(index)  # 2

Метод index() при отсутствии значения выбрасывает ValueError, в отличие от строкового find(), которого у списков нет.

Задача 9. Разбиение на части

Разбейте список на части по три элемента.

Решение:

my_list = [1, 2, 3, 4, 5, 6, 7, 8]
size = 3
chunks = [my_list[i:i + size] for i in range(0, len(my_list), size)]
print(chunks)  # [[1, 2, 3], [4, 5, 6], [7, 8]]

Решение построено на генераторе списка, о нем подробно в статье про list comprehension. В Python 3.12 для этого есть готовая функция itertools.batched(), она возвращает кортежи.

Задача 10. Фильтрация по условию

Оставьте в списке только числа больше 25.

Решение:

my_list = [10, 20, 30, 40, 50]
result = [x for x in my_list if x > 25]
print(result)  # [30, 40, 50]

Тот же результат дает list(filter(lambda x: x > 25, my_list)), но генератор списка читается проще.

Задача 11. Удаление всех вхождений значения

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

Решение:

my_list = [1, 3, 2, 3, 4, 3]
value = 3
my_list = [x for x in my_list if x != value]
print(my_list)  # [1, 2, 4]

Метод remove() удаляет только первое совпадение и падает с ошибкой, если значения нет. Удалять элементы в цикле for по тому же списку нельзя: индексы сдвигаются, и часть элементов пропускается.

Задача 12. Проверка наличия элемента

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

Решение:

my_list = [10, 20, 30, 40, 50]
x = 30
print("есть" if x in my_list else "нет")  # есть

Оператор in перебирает список последовательно. При частых проверках в большом наборе данных быстрее работает множество.

Задачи посложнее

Эти упражнения требуют сочетать несколько приемов: сортировку, словари и вложенные списки.

Задача 13. Второй по величине элемент

Найдите второе по величине значение среди различных чисел списка.

Решение:

nums = [4, 9, 2, 9, 7]
second = sorted(set(nums))[-2]
print(second)  # 7

Задача 14. Частота элементов

Посчитайте, сколько раз встречается каждый элемент, и выведите самый частый.

Решение:

from collections import Counter

words = ["a", "b", "a", "c", "a", "b"]
counts = Counter(words)
print(counts)                 # Counter({'a': 3, 'b': 2, 'c': 1})
print(counts.most_common(1))  # [('a', 3)]

Задача 15. Циклический сдвиг

Сдвиньте элементы списка вправо на k позиций: последние элементы переходят в начало.

Решение:

nums = [1, 2, 3, 4, 5]
k = 2 % len(nums)
print(nums[-k:] + nums[:-k])  # [4, 5, 1, 2, 3]

Остаток от деления защищает от k, большего длины списка. При k = 0 срез nums[-0:] вернул бы весь список, а nums[:-0] пустой, поэтому результат все равно будет верным.

Задача 16. Плоский список из вложенного

Преобразуйте список списков в один плоский список.

Решение:

matrix = [[1, 2], [3, 4, 5], [6]]
flat = [x for row in matrix for x in row]
print(flat)  # [1, 2, 3, 4, 5, 6]

Порядок циклов в генераторе такой же, как во вложенных for: сначала внешний по строкам, затем внутренний по элементам.

Частые вопросы

Ответы на вопросы, которые возникают при решении задач со списками.

Почему sort() возвращает None?

Метод сортирует список на месте и не создает новый объект. Запись a = a.sort() затирает список значением None. Нужен новый список - используйте sorted(a).

Как скопировать список, чтобы изменения не затронули оригинал?

Для плоского списка подойдут a.copy(), list(a) или a[:]. Если внутри есть вложенные списки, нужна глубокая копия copy.deepcopy(a).

Чем список отличается от кортежа?

Список изменяемый, кортеж нет. Кортеж можно использовать как ключ словаря и элемент множества, а список нельзя.

Как пройти по списку вместе с индексами?

Используйте for i, x in enumerate(a). Это короче и надежнее, чем range(len(a)) с обращением по индексу.