При работе со списками часто приходится комбинировать данные нескольких списков. Как это делается в 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.