Перейти к содержимому
Теория · Списки · урок 2 из 11

Методы списков

Представьте очередь в кассу. Люди встают в её конец, кто-то с маленьким ребёнком проходит вперёд, кассир обслуживает первого, а последний вдруг уходит. Очередь всё время одна и та же, меняется только её состав.

Список в программе живёт так же: в корзину добавляют товары, из очереди уходят люди. Для этого у списка есть свои методы. Их вызывают через точку, как методы строк. Но методы строки возвращают новую строку, а эти методы меняют сам список:

Python
queue = ["Ann", "Bob"]
queue.append("Kim")
queue.insert(0, "Zoe")
print(queue)  # ['Zoe', 'Ann', 'Bob', 'Kim']
first = queue.pop(0)
last = queue.pop()
print(first, last, queue)  # Zoe Kim ['Ann', 'Bob']
queue.remove("Bob")
queue.extend(["Lee", "Max"])
print(queue)  # ['Ann', 'Lee', 'Max']

Давайте разберём, что происходит с очередью:

  1. Сначала в ней стоят 'Ann' и 'Bob'.
  2. queue.append("Kim") ставит 'Kim' в конец.
  3. queue.insert(0, "Zoe") пропускает 'Zoe' вперёд, на место с индексом 0.
  4. queue.pop(0) уводит первого, 'Zoe', и возвращает его: он попадает в first.
  5. queue.pop() без аргумента уводит последнего, 'Kim'.
  6. queue.remove("Bob") убирает 'Bob', где бы он ни стоял.
  7. queue.extend(["Lee", "Max"]) ставит в конец сразу двоих.

Пять методов

Пять методов меняют состав списка:

  • append(x) добавляет x в конец списка;
  • extend(items) добавляет в конец все элементы items, как +=;
  • insert(i, x) вставляет x перед элементом с индексом i;
  • pop(i) убирает элемент с индексом i и возвращает его, а pop() — последний;
  • remove(x) убирает первый элемент, равный x.

Два метода останавливают программу, когда убрать нечего:

  • pop из пустого списка — с ошибкой IndexError;
  • remove значения, которого в списке нет, — с ошибкой ValueError.

append и extend

Оба метода добавляют в конец, но считают добавленное по-разному.

Метод append

append всегда добавляет ровно один элемент. nums.append([3, 4]) кладёт в конец весь список [3, 4] как один элемент, и длина nums растёт на единицу. В очереди это один человек с сумкой, а не двое.

Метод extend

extend перебирает свой аргумент и добавляет каждый его элемент отдельно. После nums.extend([3, 4]) длина nums растёт на два. Так же работает запись nums += [3, 4].

Сортировка

Представьте книги на полке. Их можно переставить прямо на полке по алфавиту. А можно выписать названия на листок и упорядочить их там, оставив полку как была. В Python есть оба способа:

Python
nums = [3, 1, 2]
ordered = sorted(nums)
print(ordered, nums)  # [1, 2, 3] [3, 1, 2]
nums.sort(reverse=True)
print(nums)  # [3, 2, 1]

Разберём пример:

  1. Функция sorted(nums) строит новый отсортированный список [1, 2, 3], а nums остаётся [3, 1, 2].
  2. Метод nums.sort(reverse=True) переставляет элементы самого nums, теперь по убыванию.

Метод sort сортирует список на месте: меняет сам список и возвращает None. Именованный аргумент reverse=True сортирует по убыванию — и в sort, и в sorted. Строки сортируются по алфавиту, и заглавные буквы идут раньше строчных.

Этот вопрос часто задают на собеседовании: «Чем sort отличается от sorted?» Ответ:

  • sort — метод списка: переставляет сам список и возвращает None;
  • sorted — функция: возвращает новый список и не трогает исходный.

Строка и список

Строку часто нужно разрезать на части или собрать из частей. Для этого есть пара методов строки.

Метод split

split разрезает строку на список строк, как ножницы ленту. Без аргумента он делит текст по пробелам, и несколько пробелов подряд считаются одним. С аргументом он делит по указанной строке.

Метод join

join делает обратную работу: строка, у которой его вызвали, встаёт между элементами списка. Склеивает он только строки: список чисел он не примет и остановит программу с ошибкой TypeError.

Python
words = "red green  blue".split()
print(words)  # ['red', 'green', 'blue']
print("3,14,15".split(","))  # ['3', '14', '15']
print("-".join(words))  # red-green-blue

Частая ошибка

Результат sort записали обратно в переменную:

Python
nums = [3, 1, 2]
nums = nums.sort()  # ✗
print(nums[0])
TEXT
TypeError: 'NoneType' object is not subscriptable

sort отсортировал список и вернул None, а присваивание связало nums с этим None. Отсортированный список потерян, а взять индекс у None нельзя. Вызывайте nums.sort() отдельной строкой или пишите nums = sorted(nums).

Главное

  • append, extend, insert, pop и remove меняют сам список.
  • append добавляет ровно один элемент, а extend — каждый элемент своего аргумента.
  • sort сортирует на месте и возвращает None, а sorted возвращает новый список.
  • split режет строку на список строк, а join склеивает список строк в одну.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом