Рубрики
Без рубрики

Append vs Extend в списках Python

Автор оригинала: Scott Robinson.

Добавление элементов в список

Списки-это одна из самых полезных структур данных, доступных в Python или любом другом языке программирования, поскольку они используются в очень многих различных алгоритмах и решениях.

После того, как мы создали список, часто нам может понадобиться добавить в него новые элементы, будь то в конце, начале или где-то посередине. Python предлагает нам три различных метода для этого. В этой статье я покажу различия между методами append , extend и insert list.

Добавлять

Этот метод добавляет элемент в конец существующего списка. Синтаксис для его использования таков:

a.append(x)

Здесь переменная a – это наш список, а x – добавляемый элемент. Это выражение эквивалентно a[len(a):] = [x] .

Например, вот как использовать его для размещения элемента “y” в конце нашего списка, a :

a = [1, 'x', 2]
a.append('y')

print(a)

Запуск этого кода приведет к следующему результату:

$ python append.py
[1, 'x', 2, 'y']

Вставить

Этот метод вставляет элемент в заданную позицию в заданном списке. Синтаксис таков:

a.insert(i, x)

Здесь аргумент i является индексом элемента перед которым вставляется элемент x . Таким образом, a.insert(len(a), x) – это то же самое, что a.append(x) . Хотя сила этого метода заключается в том, что он использует его для размещения элементов где-то в списке, а не в конце. Если вам нужно было только добавить элемент в конец списка, то append отлично подходит для этого и работает быстрее (что имеет значение для больших списков).

Например:

a = [1, 'x', 'y']
a.insert(2, 2)

print(a)

Этот код приведет к следующему результату:

$ python insert.py
[1, 'x', 2, 'y']

Как вы можете видеть, данный элемент помещается в любом месте указанного нами списка. Это хорошо работает, когда у вас есть список, в котором его элементы упорядочены, поэтому вы не можете просто добавить свой элемент в конец, как вы сделали бы с append .

Расширять

Этот метод добавляет элементы (обратите внимание на его множественное число!) в список, добавляя все элементы итерабли, которые вы ему передаете. Результирующий список-это список, содержащий все элементы обоих списков.

Синтаксис использования этого метода таков:

a.extend(x)

В этом случае a – это наш список, а x – итеративный объект, например другой список. Этот метод эквивалентен a[len(a):] .

Например:

a = [1, 'x', 'y']
b = [1, 2]
a.extend(b)

print(a)

Запуск этого кода приводит к следующему результату:

$ python extend.py
[1, 'x', 'y', 1, 2]

Обратите внимание, как два списка были объединены вместе, один за другим.

В Python вы также можете достичь тех же результатов, выполнив простое сложение. Таким образом, a + b в этом случае приведет к тому же самому точному массиву , что и наш сценарий выше. Это происходит благодаря методу __add__ () , реализованному в списках, но это выходит за рамки данной статьи.

Сравнение Каждого Метода

Чтобы увидеть различные результаты, полученные с помощью этих методов, давайте проведем прямое сравнение, выполнив следующий код:

a1 = [1, 'x', 'y']
a2 = [1, 'x', 'y']
a3 = [1, 'x', 'y']

b = [2, 3]

a1.append(b)
a2.insert(3, b)
a3.extend(b)

print(a1)
print(a2)
print(a3)

В этой программе мы определили три списка с точно такими же элементами. Мы также определили второй список, который мы добавляем, вставляем и расширяем к каждому из трех аналогичных списков, определенных ранее. В результате получается следующее:

$ python all.py
[1, 'x', 'y', [2, 3]]
[1, 'x', 'y', [2, 3]]
[1, 'x', 'y', 2, 3]

Как мы видим, и append , и insert добавляют список b к исходному списку, но как единый элемент, который является списком. Другими словами, он не добавляет каждый элемент b по отдельности, а вместо этого добавляет сам объект целиком.

Метод extend , с другой стороны, фактически добавляет отдельные элементы списка b как отдельные и уникальные элементы результирующего списка.

Все это согласуется с тем, что мы видели ранее, то есть добавить и вставить добавить только один элемент. В то время как extend расширяет исходный список, добавляя элементы второго списка в его конце.

Еще одно различие, которое следует учитывать, – это мера эффективности. Учитывая, как работает каждая операция, мы можем довольно легко вычислить временную сложность для каждого метода. Или вы можете просто обмануть и проверить страницу Time Complexity on python.org-это вики-страница.

Временные сложности заключаются в следующем:

добавлять() O(1)
вставлять() O(n)
расширять() O(k)

Здесь “n” – это количество элементов, находящихся в данный момент в списке, а “k” – количество элементов в объекте параметра.

Эти пункты показывают, что эти три метода дополняют друг друга. Мы должны выбрать, какой из них использовать, в соответствии с нашими потребностями:

  • Если мы хотим добавить элемент в конец списка, мы должны использовать append . Это быстрее и прямее.
  • Если мы хотим добавить элемент где-то в списке, мы должны использовать insert . Это единственный вариант для этого.
  • Если мы хотим объединить элементы другой итерации в наш список, то мы должны использовать extend .

Обертывание

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