Python. Изменение списков, срезы

11 класс

Поделиться статьей:

Informatics

Введение

В этой статье продолжим знакомиться со списками. Рассмотрим их методы и научимся делать срезы.

Термины, которые будем использовать:

списочные методы, ссылочный тип данных, ссылка, объект, срез, отрицательная индексация.

Списочные методы

  1. append(x) — добавление элемента в конец списка.

    nums = [1, 2, 3]

    nums.append(4)

    print(nums) # [1, 2, 3, 4]

  2. remove(x) — удаление первого найденного элемента x.

    items = [‘apple’, ‘banana’, ‘apple’]

    items.remove(‘apple’)

    print(items) # [‘banana’, ‘apple’] (удалился только первый ‘apple’)

  3. pop([index]) — удаление и возврат элемента по индексу (по умолчанию последнего).

    Если оставить скобки пустыми (не передать аргумент), то удаляется последний элемент из списка, при этом в отличие от предыдущих, он возвращает значение удалённого элемента, поэтому результат этой операции можно присвоить переменной.

    numbers = [10, 20, 30]

    last = numbers.pop()

    print(last) # 30

    print(numbers) # [10, 20]

    second = numbers.pop(0)

    print(second) # 10

  4. clear() — полная очистка списка.

    data = [1, 2, 3]

    data.clear()

    print(data) # []

  5. 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

  6. count(x) — подсчёт количества вхождений элемента.

    scores = [5, 3, 5, 4, 5, 2]

    count_fives = scores.count(5)

    print(count_fives) # 3

  7. 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]

  8. 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]

Это не все методы списков, лишь основные, которые понадобятся тебе в ЕГЭ. Давай закрепим важные особенности:

  1. Методы, изменяющие список (append, remove, pop, clear, sort), работают на месте (изменяют исходный список).
  2. Методы index, count, copy не изменяют исходный список.
  3. pop() возвращает удалённый элемент, remove() — нет.

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

Функции для работы со списками

Рассмотрим основные функции для работы с коллекциями, в них можно передать список и получить определённый результат:

  1. len() — возвращает длину (количество элементов) списка,
  2. min() — возвращает наименьший элемент списка,
  3. max() — возвращает наибольший элемент списка,
  4. sum() — возвращает сумму всех элементов списка (элементы должны быть числами),
  5. 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]

Особенности работы со срезами

  1. Индексы за пределами списка не вызывают ошибку.
    nums = [1, 2, 3]

    print(nums[1:10]) # [2, 3] — просто обрезается.

  2. Пустой список, если начало >= конца.

    print(nums[3:1]) # []

  3. При отрицательном шаге начало должно быть >= конца.

    print(nums[3:1:–1]) # [3, 2]

Поздравляю с завершением цикла статей про списки! Для усвоения такого большого количества материала попрактикуйся на задачах. Удачи!

Реши задачи

Задача 1: базовая работа с методами списка

Дан список чисел: [5, 2, 8, 2, 4, 2, 9].

  1. Добавьте в конец число 7.
  2. Удалите первое вхождение числа 2.
  3. Удалите элемент с индексом 3 и сохраните его в переменную removed.
  4. Найдите индекс числа 8.
  5. Отсортируйте список по возрастанию.

Выведите итоговый список и значение 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: копирование и изменение списков

  1. Создайте список original = [10, 20, 30, 40].
  2. Создайте переменную copy1 = original.
  3. Создайте переменную copy2 = original.copy().
  4. Добавьте число 50 в copy1.
  5. Добавьте число 60 в copy2.
  6. Удалите число 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].

Используя срезы, создайте новые списки:

  1. Содержащий элементы с индексами от 3 до 7 включительно.
  2. Содержащий первые 5 элементов.
  3. Содержащий последние 4 элемента.
  4. Содержащий каждый второй элемент всего списка.
  5. Содержащий список в обратном порядке.

Выведите все полученные списки.

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].

Вычислите и выведите:

  1. Длину списка.
  2. Минимальный элемент.
  3. Максимальный элемент.
  4. Сумму всех элементов.
  5. Новый отсортированный список (по возрастанию).
  6. Новый отсортированный список (по убыванию).

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. Измените список с помощью срезов.
  2. Замените элементы с индексами 1:3 на [‘x’, ‘y’, ‘z’].
  3. Удалите элементы с индексами 4:6.
  4. Вставьте [‘p’, ‘q’] между элементами с индексами 2 и 3.
  5. Скопируйте список с помощью среза.

Выведите все результаты.

items = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]

  1. Замена части списка.

    items[1:3] = [‘x’, ‘y’, ‘z’] # [‘a’, ‘x’, ‘y’, ‘z’, ‘d’, ‘e’, ‘f’]

    print(«1:», items)

  2. Удаление элементов через срез.

    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)

  3. Копирование с помощью среза.

    items_copy = items[:] # создаём полную копию

    items_copy.append(‘новый’)

    print(«Оригинал:», items) # не изменился

    print(«Копия:», items_copy) # с добавленным элементом

Автор:

Быкова Оксана, методист «100балльного репетитора» по информатике ЕГЭ

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

В 100б ты пробьёшь свой
максимум на экзаменах

наши лучшие курсы

Выбери подходящий курс и предмет, чтобы прокачаться и сдать ОГЭ на «5», а ЕГЭ на 80+ баллов

Выбрать курс

бесплатные материалы

Курсы, вебы, чек-листы — всё за 0 ₽

Забрать за 0 ₽

Интенсив по поступлению

Запишись на интенсив по поступлению, чтобы
взять из ЕГЭ максимум и попасть в вуз мечты

Записаться
В 100балльном репетиторе ты пробьёшь свой максимум на экзаменах

Преимущества подготовки
в 100балльном

10+
лет средний опыт наших преподавателей

18
выпускников сдали ЕГЭ
на 200 из 200 в 2024 году

300k+
учеников поступили в вуз мечты с нашей помощью 

14%
стобалльников России — наши выпускники

2 347
выпускника сдали ЕГЭ на 100 баллов

Преимущества подготовки в 100балльном

Запишись
на бесплатный
вводный урок

Познакомим с преподавателями и платформой

Расскажем про учёбу

Поможем поставить цель

  • 11 класс
  • 10 класс
  • 9 класс
  • 8 класс
  • 7 класс
Запись на вводный урок