Списковые методы append() и extend(): объяснение на примерах

При работе со списками часто приходится комбинировать данные нескольких списков. Как это делается в Python?

Поезд в горах
Добавление элементов в список напоминает добавление вагонов в состав поезда

В этой статье мы рассмотрим различные способы комбинирования данных из разных списков. В частности, мы познакомимся с методами append() и extend() и разберем их работу на примерах.

Как в Python используется оператор +

Прежде чем приступить к методам append() и extend(), давайте посмотрим, как происходит конкатенация (объединение) списков при помощи оператора +.

Допустим, у нас есть два списка, list_1 и list_2, которые мы хотим объединить (то есть склеить вместе два целых списка).

list_1 = [1,2,3,4,5]
list_2 = [6,7,8]

print(list_1 + list_2)
# Output
[1, 2, 3, 4, 5, 6, 7, 8]

print(list_1)
# Output
[1, 2, 3, 4, 5]

print(list_2)
# Output
[6, 7, 8]

Если вы внимательно прочтете приведенный выше код, вы заметите следующие вещи:

  • list_1 + list_2 не добавляет элементы из list_2 в list_1.
  • Вместо этого создается новый список, содержащий элементы из list_1 и list_2.
  • В результате сами списки list_1 и list_2 остаются в первозданном виде.

Но что, если нам нужно не создавать новый список, а модифицировать list_1? Давайте воспользуемся для этого методами append() и extend().

Использование метода append() в Python

Возьмем наш пример из предыдущего раздела, но теперь попробуем изменить первый список, добавив в него элементы второго.

В коде, приведенном ниже, для списка list_1 вызывается метод append(), которому в качестве аргумента передается list_2.

# Добавим list_2 к list_1
list_1.append(list_2)
print(list_1)

# Output
[1, 2, 3, 4, 5, [6, 7, 8]]


# Выведем длину list_1
print(len(list_1))

# Output
6

Мы видим, что list_2 добавился в конец list_1 как отдельный элемент.

Таким образом, длина list_1 в результате операции append() увеличилась на единицу.

Но что, если мы хотим добавить в list_1 не список list_2 целиком, как отдельный элемент, а все элементы этого списка? Мы рассмотрим, как это делается, в следующем разделе.

Использование метода extend() в Python

Прежде чем воспользоваться методом extend(), давайте проделаем следующие шаги:

  • переберем в цикле list_2
  • добавим каждый элемент list_2 в list_1 при помощи метода append().
for item in list_2:
  list_1.append(item)

print(list_1)

# Output
[1, 2, 3, 4, 5, 6, 7, 8]

Итак, мы добавили все элементы второго списка в первый — как и хотели.

То же самое можно сделать путем вызова метода extend() для list_1. В качестве аргумента методу передается list_2. Как это работает, вы можете видеть в следующем примере:

# Расширим list_1 за счет элементов из list_2
list_1.extend(list_2)
print(list_1)

# Output
[1, 2, 3, 4, 5, 6, 7, 8]

# Выведем длину list_1
print(len(list_1))

# Output
8

Таким образом, если вы расширяете список с длиной len1 за счет элементов списка с длиной len2, то длина списка, для которого вызвали метод extend(), станет len1 + len2.

Есть ли здесь какие-то подводные камни?

Допустим, мы хотим добавить к первому списку не целый список (или любой другой итерируемый объект), а какой-то один элемент. Давайте используем метод append() и добавим к списку list_1 булево значение True.

list_1 = [1,2,3,4,5]
list_1.append(True)
print(list_1)

# Output
[1, 2, 3, 4, 5, True]

А что будет, если мы попытаемся использовать с той же целью метод extend()?

list_1 = [1,2,3,4,5]
list_1.extend(True)
print(list_1)

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-9e4e0d6da67b> in <module>()
      1 list_1 = [1,2,3,4,5]
----> 2 list_1.extend(True)
      3 print(list_1)

TypeError: 'bool' object is not iterable

Это приводит к ошибке. Давайте разберем полученное сообщение. TypeError: 'bool' object is not iterable. Это значит, что у нас был аргумент неподходящего типа.

Метод extend() принимает в качестве аргумента только итерируемые объекты. «Под капотом» extend() перебирает в цикле итерируемый объект и добавляет каждый его элемент к первому списку.

Итерируемый объект — это любой объект, который вы можете перебрать в цикле и получить доступ к каждому отдельному элементу этого объекта. Для использования с extend() годятся списки, множества, кортежи и строки.

Общий синтаксис использования метода extend()list_name.extend(iterable).

Использование методов extend() и append() со строками

Строки, по сути своей, — последовательности символов, а значит, они относятся к итерируемым объектам. Давайте попробуем применить методы extend() и append() к list_1, а в качестве аргумента передать строку.

Добавим к списку list_1 строку ‘Happy’ при помощи метода append().

list_1 = [1,2,3,4,5]
list_1.append('Happy')
print(list_1)

# Output
[1, 2, 3, 4, 5, 'Happy']

А теперь давайте попробуем сделать то же самое при помощи метода extend(). Сейчас у нас не должно возникнуть ошибок. По идее, метод extend() переберет строку и добавит каждый символ к list_1. Давайте посмотрим, сработает ли.

list_1 = [1,2,3,4,5]
list_1.extend('Happy')
print(list_1)

# Output
[1, 2, 3, 4, 5, 'H', 'a', 'p', 'p', 'y']

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

Итоги

Надеемся, эта статья помогла вам разобраться, как использовать методы append() и extend() в коде на Python.