Методы списков
Представьте очередь в кассу. Люди встают в её конец, кто-то с маленьким ребёнком проходит вперёд, кассир обслуживает первого, а последний вдруг уходит. Очередь всё время одна и та же, меняется только её состав.
Список в программе живёт так же: в корзину добавляют товары, из очереди уходят люди. Для этого у списка есть свои методы. Их вызывают через точку, как методы строк. Но методы строки возвращают новую строку, а эти методы меняют сам список:
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']Давайте разберём, что происходит с очередью:
- Сначала в ней стоят
'Ann'и'Bob'. queue.append("Kim")ставит'Kim'в конец.queue.insert(0, "Zoe")пропускает'Zoe'вперёд, на место с индексом0.queue.pop(0)уводит первого,'Zoe', и возвращает его: он попадает вfirst.queue.pop()без аргумента уводит последнего,'Kim'.queue.remove("Bob")убирает'Bob', где бы он ни стоял.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 есть оба способа:
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]Разберём пример:
- Функция
sorted(nums)строит новый отсортированный список[1, 2, 3], аnumsостаётся[3, 1, 2]. - Метод
nums.sort(reverse=True)переставляет элементы самогоnums, теперь по убыванию.
Метод sort сортирует список на месте: меняет сам список и возвращает None. Именованный аргумент reverse=True сортирует по убыванию — и в sort, и в sorted. Строки сортируются по алфавиту, и заглавные буквы идут раньше строчных.
Этот вопрос часто задают на собеседовании: «Чем sort отличается от sorted?» Ответ:
sort— метод списка: переставляет сам список и возвращаетNone;sorted— функция: возвращает новый список и не трогает исходный.
Строка и список
Строку часто нужно разрезать на части или собрать из частей. Для этого есть пара методов строки.
Метод split
split разрезает строку на список строк, как ножницы ленту. Без аргумента он делит текст по пробелам, и несколько пробелов подряд считаются одним. С аргументом он делит по указанной строке.
Метод join
join делает обратную работу: строка, у которой его вызвали, встаёт между элементами списка. Склеивает он только строки: список чисел он не примет и остановит программу с ошибкой TypeError.
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 записали обратно в переменную:
nums = [3, 1, 2]
nums = nums.sort() # ✗
print(nums[0])TypeError: 'NoneType' object is not subscriptablesort отсортировал список и вернул None, а присваивание связало nums с этим None. Отсортированный список потерян, а взять индекс у None нельзя. Вызывайте nums.sort() отдельной строкой или пишите nums = sorted(nums).
Главное
append,extend,insert,popиremoveменяют сам список.appendдобавляет ровно один элемент, аextend— каждый элемент своего аргумента.sortсортирует на месте и возвращаетNone, аsortedвозвращает новый список.splitрежет строку на список строк, аjoinсклеивает список строк в одну.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.