Списки в Python позволяют хранить упорядоченные последовательности элементов любых типов (числа, строки, объекты и даже другие списки). Они изменяемы, поддерживают индексацию, срезы и множество методов для добавления, удаления и модификации элементов.
В этой статье мы сосредоточимся на способах добавления элементов в списки и разберем, когда использовать append(), а когда — extend().
Метод append() для добавления одного элемента
Метод append() нужен для добавления одного элемента в конец списка. Это один из самых простых и часто используемых методов модификации списков. Он поддерживает элементы любого типа данных: числа, строки, списки, словари и даже пользовательские объекты.
Синтаксис
Допустим, что есть список элементов list, которому мы хотим добавить еще один элемент unit. Это будет выглядеть так:
list.append(unit)
Таким образом unit будет добавлен в конец списка list.
Примеры
- Добавление числа, строки или объекта в список
Создаем пустой список:
my_list = []
Добавляем число:
my_list.append(5) print(my_list)
Вывод: [5]
Добавляем строку:
my_list.append("Hello") print(my_list)
Вывод: [5, «Hello»]
Добавляем объект словарь:
my_list.append({"key": "value"}) print(my_list)
Вывод: [5, «Hello», {«key»: «value»}]
Обратите внимание, что append() может принимать в один список любой объект Python. Список может состоять из чисел, строк и других объектов.
- Добавление другого списка одним объектом
Создаем список:
numbers = [1, 2, 3]
Добавляем вложенный список в numbers:
numbers.append([4, 5]) print(numbers)
Вывод: [1, 2, 3, [4, 5]]
Таким образом, append() не распаковывает вложенные списки, а добавляет их единым элементом.
- Добавление элементов одного списка в другой список по одному
Списки можно добавлять в другие списки не только как цельный объект, но и поэлементно.
Например, создадим два списка — source и target.
source = [1, 2, 3, 4, 5] target = []
Воспользуемся циклом for, чтобы добавить элементы в список по определенному условию: добавлять будем только четные числа.
for num in source: if num % 2 == 0: target.append(num)
Выводим получившийся список:
print(target)
Вывод: [2, 4]
Таким образом, четные числа из source добавились в target по одному.
- Работа с изменяемыми переменными
Объекты типа list (список), set (множество), dict (словарь) и class (экземпляр класса) являются изменяемыми.
Пример со списком
Создаем список my_list:
my_list = [0, 1]
Создаем еще один список new_list:
new_list = [2, 3]
Затем добавляем new_list в my_list:
my_list.append(new_list) print(my_list)
Вывод: [0, 1, [2, 3]]
Изменяем вложенный список new_list и выводим my_list:
nested_list.append(4) print(my_list)
Вывод: [0, 1, [2, 3, 4]]
Пример со словарем
Создаем словарь d и пустой список list:
d = {"x": 1} list = []
Добавляем в list объект словаря d:
list.append(d)
При выводе списка получим:
[{'x': 1}]
Затем добавляем в словарь новую пару «ключ — значение» и выводим получившийся list:
d["y"] = 2 print(list)
Вывод: [{‘x’: 1, ‘y’: 2}]
Получается, что если объект изменяемый, то его последующие изменения отражаются в списке, в который его добавили.
А неизменяемые переменные, такие как строки и числовые значения, остаются в списке без изменений даже после переопределения переменной.
- Appendleft, appendright и двусторонние очереди
Для списков типа deque (двусторонняя очередь) из модуля collections в Python существуют методы appendleft() и appendright().
В отличие от обычного списка, deque (double-ended queue) принимает новые элементы как в начало, так и в конец.
По принципу работы и синтаксису appendleft() и appendright() почти эквивалентны append().
Создаем двустороннюю очередь deq:
deq = deque([1, 2, 3])
Добавляем элемент 0 в начало очереди:
deq.appendleft(0)
Добавляем 4 в конец очереди и выводим результат:
deq.appendright(4) print(deq)
Вывод: deque([0, 1, 2, 3, 4])
Особенности методов append()
Метод append() (а также appendleft() и appendright() для deque) работает in-place (на месте), то есть изменяет существующий список, а не создает новый. Иначе говоря, он возвращает None.
Например:
my_list = [1, 2] result = my_list.append(3) print(result)
Вывод: None
print(my_list)
Вывод: [1, 2, 3]
Это эффективно с точки зрения памяти (временная сложность — O(1), в том числе и для deque).
Метод extend() для добавления нескольких элементов
В отличие от append(), который добавляет один элемент, extend() распаковывает итерируемый объект (строку, список, кортеж или множество) и добавляет его элементы по отдельности.
Метод extend() работает с любым итерируемым объектом, включая генераторы. Но если аргумент неитерируемый, возникнет ошибка TypeError.
Синтаксис
По тому же принципу, что и в append(), добавляем в список list итерируемый объект iterable с помощью extend():
list.extend(iterable)
Примеры
- Добавление элементов из другого списка, кортежа или множества
Создаем список с элементами:
my_list = [1, 2]
С помощью extend() добавляем в него элементы из другого списка:
my_list.extend([3, 4]) print(my_list)
Вывод: [1, 2, 3, 4]
Добавляем элементы из кортежа my_tuple (неизменяемого списка):
my_tuple = (5, 6) my_list.extend(my_tuple) print(my_list)
Вывод: [1, 2, 3, 4, 5, 6]
Также можно добавить элементы из множества. В данном случае в множестве содержится другое множество — неизменяемое (frozenset):
my_set = {1, "hello", frozenset([7, 8])} my_list.extend(my_set) print(my_list)
Вывод: [1, 2, 3, 4, 5, 6, 1, «hello», frozenset({7, 8})]
При этом порядок элементов из множества не гарантирован, так как множества в Python не упорядочены: они не имеют фиксированного порядка и могут возвращаться в произвольном порядке.
Также важно помнить, что в множестве нельзя использовать обычные списки, так как они не хешируемы.
Таким образом, добавление элементов с помощью extend() равнозначно добавлению списка поэлементно в другой список с помощью append() и цикла for.
- Работа со строками (распаковка символов)
my_list = ["a", "b"]
Распаковываем строку, добавляем в список и выводим результат:
my_list.extend("xyz") print(my_list)
Вывод: [«a», «b», «x», «y», «z»]
- Добавление элементов из генератора
my_list = [1, 2]
Распаковываем элементы из генератора range (создающий последовательность чисел):
my_list.extend(range(3, 5))
Генератор range(3, 5) генерирует целые числа от 3 (включительно) до 5 (невключительно) с шагом 1. Он создает итерируемый объект, возвращающий числа 3 и 4.
print(my_list)
Вывод: [1, 2, 3, 4]
Используем генераторное выражение для получения другого результата:
my_list.extend(x * 2 for x in [3, 4]) print(my_list)
Вывод: [1, 2, 3, 4, 6, 8]
- Добавление пустого итерируемого объекта
Пустой итерируемый объект (например, пустой список, кортеж или множество) не содержит элементов, поэтому его добавление через extend() не изменяет список.
my_list = [1, 2, 3, 4] my_list.extend([]) print(my_list)
Вывод: [1, 2, 3, 4]
- Добавление списка словарей
my_list = [{"id": 1}]
Добавляем список словарей:
my_list.extend([{"id": 2}, {"id": 3}])
Каждый словарь из списка добавляется как отдельный элемент.
print(my_list)
Вывод: [{«id»: 1}, {«id»: 2}, {«id»: 3}]
- Метод extendleft() для двусторонних очередей
Как и append(), метод extend() применяется с deque. Метод extendleft() добавляет элементы итерируемого объекта в начало, а extend() — в конец.
deq = deque([1, 2])
Добавляем элементы в начало:
deq.extendleft([3, 4]) print(deq)
Вывод: deque([4, 3, 1, 2])
Добавляем элементы в конец:
deq.extend([5, 6]) print(deq)
Вывод: deque([4, 3, 1, 2, 5, 6])
Особенности методов extend()
Как и в случае с append(), extend() также модифицирует список in-place, но его временная сложность отличается и равна O(n), где n — количество элементов в итерируемом объекте.
Какой метод выбрать
- Используйте append(), если нужно добавить один элемент (число, строку, список, словарь) как единый объект.
- Используйте extend(), если нужно добавить несколько элементов из итерируемого объекта (списка, кортежа, множества, строки) по одному. Либо можно использовать append() в комбинации с циклом for, чтобы «вытаскивать» объект из другого списка поэлементно.