Python insert и extend: вставка по индексу и добавление пачкой
insert ставит элемент по индексу и сдвигает остальных вправо, extend раскладывает пачку на отдельные элементы. Оба меняют список на месте и возвращают None.
Редакция Питоники
append из прошлого урока кладёт элементы только в конец. Две соседние задачи он не закрывает: поставить значение на конкретное место — вторым пунктом в плане, первым в очередь — и добавить сразу готовую пачку значений, а не по одному. Для них у списка есть методы insert и extend. Оба, как и append, меняют список на месте и возвращают None, но работают по-разному, и путаница между ними — источник тихих ошибок. Разберём оба по очереди.
insert: вставка на место
Метод принимает два аргумента: индекс, куда встать, и само значение. Всё, что стояло правее, сдвигается на одну позицию вправо:
tasks = ['помыть пол', 'купить хлеб']
tasks.insert(1, 'позвонить маме')
print(tasks)
tasks.insert(0, 'выключить утюг')
print(tasks)
['помыть пол', 'позвонить маме', 'купить хлеб'] ['выключить утюг', 'помыть пол', 'позвонить маме', 'купить хлеб']
Первый вызов поставил звонок маме на индекс 1 — между полом и хлебом, второй поставил утюг в начало. Вставка не заменяет, а раздвигает: длина каждый раз растёт на единицу, ни один элемент не потерялся. Индекс 0 — это всегда начало списка, откуда и растёт нумерация из урока про индексы.
insert не падает на большом индексе
Логика подсказывает: если индекс больше длины списка, Python должен ругнуться. На деле он ведёт себя тише:
tasks = ['купить хлеб']
tasks.insert(99, 'помыть пол')
print(tasks)
print(len(tasks))
['купить хлеб', 'помыть пол'] 2
Индекс 99 при одном элементе не вызвал ошибки: insert молча добавил задачу в конец. Ошибку выдаёт только отрицательный сдвиг дальше начала, например insert(-99, x) — элемент ляжет в начало. Это ловушка: опечатка в индексе не падает, а тихо меняет место вставки, и список оказывается не тем, что планировалось. Проверяйте индексы по правилам урока про индексы — там же о честной ошибке IndexError при чтении.
extend: добавить пачку
extend принимает коллекцию, раскладывает её на отдельные элементы и дописывает их в конец. В корзину приехала целая доставка:
cart = ['хлеб']
cart.extend(['яйца', 'сок', 'сыр'])
print(cart)
print(len(cart))
['хлеб', 'яйца', 'сок', 'сыр'] 4
Три товара легли тремя отдельными элементами, длина выросла с одного до четырёх. Разницу с append видно лучше всего на одинаковом входе — рядом, в одном коде:
a = [1, 2]
b = [1, 2]
a.append([3, 4])
b.extend([3, 4])
print(a)
print(b)
print(len(a), len(b))
[1, 2, [3, 4]] [1, 2, 3, 4] 3 4
append кладёт в конец один предмет, extend высыпает содержимое коробки: список в аргументе разворачивается в отдельные элементы. Отсюда правило выбора: по одному значению — append, готовой коллекцией — extend. Путаница между ними даёт либо лишнюю вложенность, либо недостающие элементы, поэтому проверяйте len после пополнения — как в уроке про len.
extend раскладывает строки на буквы
extend принимает любое перебираемое, а строка перебирается по символам. Поэтому extend от строки добавляет отдельные буквы, а не одну строку:
letters = ['а', 'б']
letters.extend('вг')
print(letters)
print(len(letters))
['а', 'б', 'в', 'г'] 4
Две буквы строки легли двумя элементами. Хотите положить строку как единое целое — используйте append: он не разбирает аргумент на части. Заодно extend работает и с range — пачка чисел из диапазона добавляется без цикла:
nums = [1, 2]
nums.extend(range(3, 6))
print(nums)
print(len(nums))
[1, 2, 3, 4, 5] 5
extend требует перебираемое
Число перебирать нельзя, поэтому extend от одного числа падает. Перехватим ошибку и заодно покажем правильный путь — append:
nums = [1, 2]
try:
nums.extend(3)
except TypeError as e:
print('Ошибка:', e)
nums.append(3)
print(nums)
Ошибка: 'int' object is not iterable [1, 2, 3]
Сообщение говорит прямо: 'int' object is not iterable — число не перебирается, раскладывать нечего. Правило то же, что у set() из курса про множества: extend и set едят то, по чему умеет идти for. Если хочется добавить именно одно значение — это append, а не extend.
nums = [1, 2]
nums.extend(3)
Traceback (most recent call last):
File "app.py", line 2, in <module>
nums.extend(3)
~~~~~~~~~~~^^^
TypeError: 'int' object is not iterableТри способа пополнения рядом
Соберём append, insert и extend в одну таблицу — по ней удобно проверять себя, когда список растёт не так, как планировалось:
| Вызов | Куда кладёт | Длина вырастет на |
|---|---|---|
| append(x) | В конец | 1 — x становится одним элементом |
| insert(i, x) | На индекс i, остальные сдвигаются | 1 — даже при i больше длины, но тогда в конец |
| extend(коллекция) | В конец, раскладывая на элементы | Число элементов в коллекции |
| append([a, b]) | В конец одним вложенным элементом | 1 — внутри окажется подсписок |
Пополнение списка теперь закрыто полностью: append для одного значения, insert для места, extend для пачки. Обратная сторона — удаление: по значению, с возвратом и по индексу. Три способа убрать элемент разбирает следующий урок.
Сначала предскажи ответ в голове — это главный навык программиста.
nums = [10, 20]
nums.insert(1, 15)
nums.append(30)
print(nums)
a = [1]
b = [1]
a.append('аб')
b.extend('аб')
print(a)
print(b)
tasks = ['а', 'б', 'в']
tasks.insert(99, 'г')
print(len(tasks))
print(tasks)
1. Что делает tasks.insert(1, 'отчёт')?
2. Что произойдёт при tasks.insert(50, 'x'), если в tasks два элемента?
3. Чем extend([3, 4]) отличается от append([3, 4]) для списка [1, 2]?
4. Что добавит extend('аб') в список?
5. Что вернёт nums.extend(5)?
6. Что общего у append, insert и extend?
Дан список tasks = ['написать отчёт', 'ответить на письма']. Вставьте задачу 'созвон с командой' вторым пунктом, допишите пачку ['план на неделю', 'проверить бюджет'] и напечатайте итоговый список и его длину.
Как вставить элемент в середину списка в Python?
Методом insert: tasks.insert(1, 'отчёт') ставит значение на индекс 1 и сдвигает остальные элементы вправо. Список меняется на месте, длина растёт на единицу. Для начала списка используется insert(0, x), для конца — append.
Урок 2: append добавляет в конецЧем insert отличается от append?
insert требует индекс и ставит элемент на указанное место, append всегда дописывает в конец. По скорости append дешевле: вставка в начало или середину передвигает все элементы правее. Оба метода возвращают None и меняют список на месте.
Как добавить список к списку в Python?
Методом extend: cart.extend(['яйца', 'сок']) допишет элементы в конец как отдельные значения. Оператор плюс тоже соберёт объединение, но построит новый список: cart + доплата оставит исходный cart без изменений. extend меняет список на месте и возвращает None.
Урок 15: копирование списковПочему extend раскладывает строку на отдельные буквы?
Потому что extend принимает перебираемое, а строка перебирается по символам: 'аб' — это два символа. Поэтому extend('аб') добавит две буквы. Если нужна строка одним элементом, используйте append — он не разбирает аргумент на части.
Что будет, если insert указать индекс больше длины списка?
Ошибки не будет: элемент молча добавится в конец. insert проверяет только отрицательный уход за начало. Это тихая ловушка — опечатка в индексе меняет место вставки без падения программы, поэтому вычисленные индексы стоит проверять явно.
Урок 6: индексы и IndexErrorПонравился урок? Сошлитесь на него
«append кладёт в конец один предмет, extend высыпает содержимое коробки: список в аргументе разворачивается в отдельные элементы.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Списки · Урок 2
Python append: добавляем элемент в конец списка
append кладёт один элемент в конец списка и меняет список на месте. Метод возвращает None — поэтому строка nums = nums.append(x) теряет список.
Списки · Урок 4
Python удалить элемент из списка: remove, pop и del
remove убирает по значению, pop снимает элемент и возвращает его, del режет по индексу. Каждый падает по-своему — покажем и обезвредим.
Списки · Урок 6
Python индексы списка: с нуля и с конца, IndexError
Первый элемент списка — индекс 0, последний — -1. Отрицательные индексы считают с конца, а выход за границу падает с IndexError.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Множества · Урок 3
add и update в Python: добавление элементов в set
Множество собрано — теперь пополняем: add кладёт один элемент, update принимает списки, множества и даже строки. Дубликаты исчезают тихо, без ошибок.
python добавить элемент в множествометоды множеств python
sqlite3 · Урок 3
INSERT и SELECT в SQLite: наполняем базу и читаем строки
Полный цикл данных: INSERT с параметрами ? и executemany, SELECT с выбором колонок, fetchone и fetchall, lastrowid — и живая демонстрация SQL-инъекции.
insert intoinsert into sqlite
Списки · Урок 19
Распаковка списка в Python: звёздочка и остаток
name, price = пара без индексов, swap одной строкой, *rest забирает остаток, print(*items) печатает без скобок. Одна звёздочка — четыре приёма, которые сжимают списочный код вдвое.
python распаковка спискаpython a b = список