Введение
В этой статье продолжим знакомиться со списками. Рассмотрим их методы и научимся делать срезы.
Термины, которые будем использовать:
списочные методы, ссылочный тип данных, ссылка, объект, срез, отрицательная индексация.
Списочные методы
append(x) — добавление элемента в конец списка.
nums = [1, 2, 3]
nums.append(4)
print(nums) # [1, 2, 3, 4]
remove(x) — удаление первого найденного элемента x.
items = [‘apple’, ‘banana’, ‘apple’]
items.remove(‘apple’)
print(items) # [‘banana’, ‘apple’] (удалился только первый ‘apple’)
pop([index]) — удаление и возврат элемента по индексу (по умолчанию последнего).
Если оставить скобки пустыми (не передать аргумент), то удаляется последний элемент из списка, при этом в отличие от предыдущих, он возвращает значение удалённого элемента, поэтому результат этой операции можно присвоить переменной.
numbers = [10, 20, 30]
last = numbers.pop()
print(last) # 30
print(numbers) # [10, 20]
second = numbers.pop(0)
print(second) # 10
clear() — полная очистка списка.
data = [1, 2, 3]
data.clear()
print(data) # []
index(x) — поиск индекса первого вхождения элемента.
colors = [‘red’, ‘green’, ‘blue’, ‘green’]
idx = colors.index(‘green’)
print(idx) # 1
В случае, если искомый элемент не содержится в списке, возникнет ошибка ValueError, например:
colors = [‘red’, ‘green’, ‘blue’, ‘green’]
idx = colors.index(‘black’)
print(idx) # ValueError: ‘black’ is not in list
count(x) — подсчёт количества вхождений элемента.
scores = [5, 3, 5, 4, 5, 2]
count_fives = scores.count(5)
print(count_fives) # 3
sort(reverse=False) — сортировка списка на месте.
Исходный список сортируется по возрастанию, если указать reverse=False или не указывать вовсе, по убыванию, если указать reverse=True. При этом изменяется текущий список, новый создан не будет.
numbers = [3, 1, 4, 2]
numbers.sort()
print(numbers) # [1, 2, 3, 4]
numbers.sort(reverse=True)
print(numbers) # [4, 3, 2, 1]
- copy() — создание копии списка.
Чтобы скопировать список в другую переменную, недостаточно просто сделать присваивание list2 = list1. Это связано с тем, что список — ссылочный тип данных: переменная хранит не сам список, а ссылку на область памяти, где он расположен.
При присваивании list2 = list1 копируется только ссылка, поэтому обе переменные начинают указывать на один и тот же список в памяти. Изменения через одну переменную будут видны через другую.
Для создания независимой копии используется метод copy(). Он создаёт новый объект-список с такими же элементами и возвращает ссылку на него. После этого list1 и list2 ссылаются на разные объекты.
Проблема при обычном присваивании
list1 = [1, 2, 3]
list2 = list1 — копируется ссылка, а не список.
list2.append(4)
print(list1) # [1, 2, 3, 4] — изменился и list1!
Правильное копирование
list1 = [1, 2, 3]
list2 = list1.copy() — создаётся новый список.
list2.append(4)
print(list1) # [1, 2, 3] — list1 не изменился.
print(list2) # [1, 2, 3, 4]
Это не все методы списков, лишь основные, которые понадобятся тебе в ЕГЭ. Давай закрепим важные особенности:
- Методы, изменяющие список (append, remove, pop, clear, sort), работают на месте (изменяют исходный список).
- Методы index, count, copy не изменяют исходный список.
- pop() возвращает удалённый элемент, remove() — нет.
Функции для работы со списками
Рассмотрим основные функции для работы с коллекциями, в них можно передать список и получить определённый результат:
- len() — возвращает длину (количество элементов) списка,
- min() — возвращает наименьший элемент списка,
- max() — возвращает наибольший элемент списка,
- sum() — возвращает сумму всех элементов списка (элементы должны быть числами),
- sorted() — возвращает новый отсортированный список, есть параметр reverse= как у метода sort().
В случае функций min() и max() обязательно выполнение условия — все элементы должны быть одного и того же типа данных, это обусловлено тем, что разные типы данных не сравнимы друг с другом, а значит определить, какой из них больше/меньше невозможно.
Важно! sort() изменяет список, sorted() — возвращает новый отсортированный список.
Срезы
Как и в случае со строками, срезы позволяют получить часть исходного списка по заданным индексам.
Структура
подсписок = список[начало : конец : шаг]
Срез всегда возвращает ссылку на новый объект-список.
Начало — индекс, с которого начинается срез (включительно),
Конец — индекс, на котором заканчивается срез (не включительно),
Шаг — интервал между элементами.
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Элементы с индекса 2 до 5 (5 не включается).
print(numbers[2:5]) # [2, 3, 4]
Если срез начинается с 0 индекса, то ноль можно опустить и ничего не писать:
С начала до индекса 4.
print(numbers[:4]) # [0, 1, 2, 3]
Если срез идёт до конца, последний индекс можно также опустить:
С индекса 6 до конца.
print(numbers[6:]) # [6, 7, 8, 9]
Можно создать копию списка (именно новый объект с новой ссылкой):
Весь список (копия).
print(numbers[:]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Срез с шагом работает аналогично функции range(), по умолчанию шаг равен единице.
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Каждый второй элемент.
print(numbers[::2]) # [0, 2, 4, 6, 8]
С шагом 3, начиная с индекса 1.
print(numbers[1::3]) # [1, 4, 7]
Обратный порядок (разворот списка).
print(numbers[::–1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Отрицательные индексы
Отрицательные индексы отсчитываются с конца списка (–1 — последний элемент).
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Последние 3 элемента.
print(numbers[–3:]) # [7, 8, 9]
Все кроме последних 3.
print(numbers[:–3]) # [0, 1, 2, 3, 4, 5, 6]
С –5 до –2.
print(numbers[–5:–2]) # [5, 6, 7]
Изменение списка через срез
Вместо части элементов можно вставить произвольное количество других элементов, при этом исходные будут удалены, а между оставшимися добавятся новые:
numbers = [0, 1, 2, 3, 4]
Замена части списка.
numbers[1:3] = [10, 20, 30] — вставка больше элементов.
print(numbers) # [0, 10, 20, 30, 3, 4]
Удаление элементов.
numbers[2:4] = []
print(numbers) # [0, 10, 4]
Особенности работы со срезами
- Индексы за пределами списка не вызывают ошибку.
nums = [1, 2, 3]print(nums[1:10]) # [2, 3] — просто обрезается.
- Пустой список, если начало >= конца.
print(nums[3:1]) # []
- При отрицательном шаге начало должно быть >= конца.
print(nums[3:1:–1]) # [3, 2]
Поздравляю с завершением цикла статей про списки! Для усвоения такого большого количества материала попрактикуйся на задачах. Удачи!
Реши задачи
Задача 1: базовая работа с методами списка
Дан список чисел: [5, 2, 8, 2, 4, 2, 9].
- Добавьте в конец число 7.
- Удалите первое вхождение числа 2.
- Удалите элемент с индексом 3 и сохраните его в переменную removed.
- Найдите индекс числа 8.
- Отсортируйте список по возрастанию.
Выведите итоговый список и значение removed.
numbers = [5, 2, 8, 2, 4, 2, 9]
numbers.append(7) # [5, 2, 8, 2, 4, 2, 9, 7]
numbers.remove(2) # [5, 8, 2, 4, 2, 9, 7]
removed = numbers.pop(3) # удаляем элемент с индексом 3 (4)
idx = numbers.index(8) # находим индекс 8
numbers.sort() # сортируем
print(numbers) # [2, 2, 5, 7, 8, 9]
print(removed) # 4
Задача 2: копирование и изменение списков
- Создайте список original = [10, 20, 30, 40].
- Создайте переменную copy1 = original.
- Создайте переменную copy2 = original.copy().
- Добавьте число 50 в copy1.
- Добавьте число 60 в copy2.
- Удалите число 30 из original.
Выведите все три списка.
original = [10, 20, 30, 40]
copy1 = original # копируется ссылка
copy2 = original.copy() # создаётся новый список
copy1.append(50) # изменится original и copy1
copy2.append(60) # изменится только copy2
original.remove(30) # изменится original и copy1
print(«original:», original) # [10, 20, 40, 50]
print(«copy1:», copy1) # [10, 20, 40, 50]
print(«copy2:», copy2) # [10, 20, 30, 40, 60]
Задача 3: срезы списка
Дан список: nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
Используя срезы, создайте новые списки:
- Содержащий элементы с индексами от 3 до 7 включительно.
- Содержащий первые 5 элементов.
- Содержащий последние 4 элемента.
- Содержащий каждый второй элемент всего списка.
- Содержащий список в обратном порядке.
Выведите все полученные списки.
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
slice1 = nums[3:8] # [3, 4, 5, 6, 7]
slice2 = nums[:5] # [0, 1, 2, 3, 4]
slice3 = nums[–4:] # [6, 7, 8, 9]
slice4 = nums[::2] # [0, 2, 4, 6, 8]
slice5 = nums[::–1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(«1:», slice1)
print(«2:», slice2)
print(«3:», slice3)
print(«4:», slice4)
print(«5:», slice5)
Задача 4: функции для работы со списками
Дан список чисел: data = [12, 45, 3, 67, 23, 9, 34].
Вычислите и выведите:
- Длину списка.
- Минимальный элемент.
- Максимальный элемент.
- Сумму всех элементов.
- Новый отсортированный список (по возрастанию).
- Новый отсортированный список (по убыванию).
data = [12, 45, 3, 67, 23, 9, 34]
length = len(data) # 7
minimum = min(data) # 3
maximum = max(data) # 67
total = sum(data) # 193
sorted_asc = sorted(data) # [3, 9, 12, 23, 34, 45, 67]
sorted_desc = sorted(data, reverse=True) # [67, 45, 34, 23, 12, 9, 3]
print(«Длина:», length)
print(«Минимум:», minimum)
print(«Максимум:», maximum)
print(«Сумма:», total)
print(«По возрастанию:», sorted_asc)
print(«По убыванию:», sorted_desc)
print(«Исходный список:», data) # не изменился
Задача 45: изменение списка через срезы
Дан список: items = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]..
- Измените список с помощью срезов.
- Замените элементы с индексами 1:3 на [‘x’, ‘y’, ‘z’].
- Удалите элементы с индексами 4:6.
- Вставьте [‘p’, ‘q’] между элементами с индексами 2 и 3.
- Скопируйте список с помощью среза.
Выведите все результаты.
items = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]
- Замена части списка.
items[1:3] = [‘x’, ‘y’, ‘z’] # [‘a’, ‘x’, ‘y’, ‘z’, ‘d’, ‘e’, ‘f’]
print(«1:», items)
- Удаление элементов через срез.
items[4:6] = [] # [‘a’, ‘x’, ‘y’, ‘z’, ‘f’]
print(«2:», items)
Вставка элементов (пустой срез).
items[3:3] = [‘p’, ‘q’] # [‘a’, ‘x’, ‘y’, ‘p’, ‘q’, ‘z’, ‘f’]
print(«3:», items)
- Копирование с помощью среза.
items_copy = items[:] # создаём полную копию
items_copy.append(‘новый’)
print(«Оригинал:», items) # не изменился
print(«Копия:», items_copy) # с добавленным элементом
Автор:
Быкова Оксана, методист «100балльного репетитора» по информатике ЕГЭ