Расширение списков в Python: метод extend и альтернативы
Метод extend для списков в Python
Метод extend() добавляет все элементы из переданного итерируемого объекта в конец текущего списка. Он изменяет список на месте и не возвращает новый. Это основной способ объединить последовательности, когда нужно сохранить исходный список и дополнить его.
Самый простой способ расширить список - вызвать list.extend(iterable). Например:
a = [1, 2, 3]
a.extend([4, 5])
print(a)Python list element (получение элемента списка в python)
[1, 2, 3, 4, 5]
Python list extend (метод extend для списка)
Метод принимает любой итерируемый объект: список, кортеж, строку, множество, словарь, генератор и т.д. Элементы извлекаются по одному и добавляются в конец.
Как добавить элементы из кортежа или строки?
Вызов extend с кортежем или строкой работает аналогично. Строка разбивается на отдельные символы:
b = [0]
b.extend((1, 2))
print(b)
b.extend('abc')
print(b)Python empty list (создание пустого списка)
[0, 1, 2] [0, 1, 2, 'a', 'b', 'c']
Python list slice (срезы списков в python)
Если нужно добавить строку как один элемент, следует использовать append() или обернуть строку в список: b.extend(['abc']).
Как использовать оператор += для расширения списка?
Оператор += для списка работает как вызов extend - модифицирует список на месте:
c = [1, 2]
c += [3, 4]
print(c)Python list function (функции для работы со списками)
[1, 2, 3, 4]
Python добавить элемент в массив (добавление элемента в конец списка (append) в python)
Важно: левая часть должна быть списком. При попытке использовать c += 5 возникнет ошибка, так как число неитерируемо.
Как расширить список с помощью среза (slice assignment)?
Присваивание срезу list[len(list):] = iterable делает то же самое, что и extend. Этот способ удобен, когда нужно вставить элементы в произвольную позицию:
d = [10, 20]
d[len(d):] = [30, 40]
print(d)элемент двумерного массива python (доступ к элементу двумерного массива (списка списков) в python)
[10, 20, 30, 40]
Python обратиться к элементу списка (обращение к элементу списка по индексу в python)
Замена среза на позиции list[2:4] = ... тоже работает, но она удаляет элементы на этом участке.
Как расширить список, перебирая элементы в цикле?
Если метод extend по какой-то причине не подходит, можно использовать цикл с append(). Этот вариант менее эффективен, но даёт больше контроля (например, можно фильтровать элементы):
e = []
for x in 'hello':
if x != 'l':
e.append(x)
print(e)как заменить элемент в списке python (замена элемента в списке по индексу (list[2] = new_value) в python)
['h', 'e', 'o']
Такой подход оправдан при сложной логике добавления.
Типичные ошибки и проблемы
- TypeError: 'int' object is not iterable - если передать число. Решение: обернуть в список:
list.extend([5])или использовать append. - extend не возвращает новый список - он изменяет исходный. Новички иногда ожидают, что
a.extend(b)вернёт результат, и пишутc = a.extend(b). На самом деле c станет None. Нужно работать с изменённым a. - Путаница с append:
a.append([4,5])добавляет вложенный список, а не отдельные элементы. Если нужны элементы, используйте extend. - Изменение списка во время итерации - если расширять список, по которому идёт цикл, можно получить бесконечный цикл или пропуски. Лучше сначала скопировать список или собирать новые элементы в отдельный список.
Расширенные примеры использования extend()
Ниже приведены разнообразные примеры с пояснениями и выводом. Для каждого примера показан код и результат его выполнения.
Пример 1. Базовое расширение списка другим списком
a = [1, 2]
a.extend([3, 4])
print('a:', a)
a: [1, 2, 3, 4]
Все элементы второго списка добавляются в конец первого.
Пример 2. Расширение кортежем
b = [0]
b.extend((10, 20))
print('b:', b)
b: [0, 10, 20]
Кортеж - итерируемый объект, поэтому каждый его элемент становится элементом списка.
Пример 3. Расширение строкой
c = ['!']
c.extend('abc')
print('c:', c)
c: ['!', 'a', 'b', 'c']
Строка разбивается на символы. Если нужно добавить строку целиком, используйте c.append('abc') или c.extend(['abc']).
Пример 4. Расширение множеством (set)
d = [1, 2]
d.extend({3, 4, 5})
print('d:', d)
d: [1, 2, 3, 4, 5]
Порядок элементов из множества может отличаться от заданного, так как множество не упорядочено.
Пример 5. Расширение словарём (dict)
e = ['a']
e.extend({ 'x': 1, 'y': 2 })
print('e:', e)
e: ['a', 'x', 'y']
Из словаря добавляются только ключи. Чтобы добавить значения, используйте .extend(d.values()).
Пример 6. Расширение с помощью генератора
f = [0]
f.extend(x*2 for x in range(3))
print('f:', f)
f: [0, 0, 2, 4]
Генератор не создаёт промежуточную последовательность, что экономит память.
Пример 7. Расширение с помощью map()
g = []
g.extend(map(str, [1, 2, 3]))
print('g:', g)
g: ['1', '2', '3']
Функция map возвращает итератор, который немедленно обходится extend.
Пример 8. Расширение с помощью filter()
h = [0]
h.extend(filter(lambda x: x > 2, [1, 2, 3, 4]))
print('h:', h)
h: [0, 3, 4]
В список попадают только элементы, удовлетворяющие условию.
Пример 9. Расширение пустым итерируемым объектом
i = [1, 2]
i.extend([])
print('i:', i)
i: [1, 2]
Список не изменяется, так как в пустой последовательности нет элементов.
Пример 10. Разница между extend и append для вложенных структур
j = []
j.append([1, 2])
print('j после append:', j)
k = []
k.extend([1, 2])
print('k после extend:', k)
j после append: [[1, 2]] k после extend: [1, 2]
append добавляет переданный объект как один элемент, extend распаковывает итерируемый объект.
Пример 11. Использование оператора +=
l = [1]
l += [2, 3]
print('l:', l)
l: [1, 2, 3]
Эквивалентно l.extend([2,3]).
Пример 12. Использование slice assignment
m = [10]
m[len(m):] = (20, 30)
print('m:', m)
m: [10, 20, 30]
Аналогично extend, но позволяет вставлять элементы в любую позицию, заменив указанный срез.
Пример 13. Ошибка при передаче неитерируемого объекта
n = [1]
# n.extend(5) # TypeError
try:
n.extend(5)
except TypeError as e:
print('Ошибка:', e)
# Правильный вариант: n.extend([5])
n.extend([5])
print('n:', n)
Ошибка: 'int' object is not iterable n: [1, 5]
Число не является итерируемым, поэтому вызывается исключение. Решение - обернуть число в список.
Пример 14. Extend с None
o = []
try:
o.extend(None)
except TypeError as e:
print('Ошибка:', e)
Ошибка: 'NoneType' object is not iterable
None тоже не итерируем. Перед вызовом стоит проверять значение.
Пример 15. Совместное использование extend и копирования списка
original = [1, 2, 3]
copy_for_extension = original[:]
copy_for_extension.extend([4, 5])
print('original:', original)
print('copy:', copy_for_extension)
original: [1, 2, 3] copy: [1, 2, 3, 4, 5]
Если нужно сохранить исходный список неизменным, создаётся копия перед extend.