sequence.extend(iterable) # или sequence += iterable # или sequence + iterable
iterable
- любой объект, поддерживающий итерацию,sequence
- изменяемая последовательность, list
или bytearray
,sequence
добавляются элементы iterable
.Операция позволяет расширить список содержимым любой последовательности, которая поддерживает итерацию. Метод sequence.extend(iterable)
производит расширение последовательности sequence
содержимым итерации iterable
.
Если объект iterable
не является итерацией поднимается исключение TypeError
.
По большей части то же самое, что и sequence[len(sequence):len(sequence)] = iterable
. Эта операция поддерживаются изменяемыми типами последовательностей.
>>> x = [12, 15, 18] >>> x.extend([3, 6, 9]) >>> x # [12, 15, 18, 3, 6, 9] >>> x.extend('one') >>> x # [12, 15, 18, 3, 6, 9, 'o', 'n', 'e'] >>> x.extend(20) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # TypeError: 'int' object is not iterable >>> x.extend([20]) >>> x # [12, 15, 18, 3, 6, 9, 'o', 'n', 'e', 20] # Альтернативная операция >>> x = ['one','two','three'] # строка представляет из себя кортеж >>> x += 'abc' >>> x # ['one','two','three', 'a', 'b', 'c'] # добавление одного элемента # альтернатива операции x.append(1.3) >>> x += [1.3] >>> x # ['one','two','three', 'a', 'b', 'c', 1.3] # Добавление/расширение при помощи среза >>> x = ['a', 'b', 'c'] >>> x[3:3] = [12, 15, 18] >>> x # ['a', 'b', 'c', 12, 15, 18] # Добавление/расширение списка сложением >>> a = [1,2,3] >>> b = [4,5,6] >>> a + b # [1, 2, 3, 4, 5, 6]
Имеем список [[1, 2, 3], [10, 11], [4, 5, 6, 7], [8], [9]]
. Задача, объединить списки разной длины без обхода элементов в цикле? Вот как это можно сделать при помощи встроенной функции sum()
:
>>> lst = [[1, 2, 3], [10, 11], [4, 5, 6, 7], [8], [9]] >>> new_lst = sum(lst, []) >>> new_lst # [1, 2, 3, 10, 11, 4, 5, 6, 7, 8, 9]
Более эффективный способ (для объединения больших списков) это использование - это использование модуля itertools
и его функции itertools.chain.from_iterable()
.
>>> import itertools >>> lst = [[1, 2, 3], [10, 11], [4, 5, 6, 7], [8], [9]] >>> new_iter = itertools.chain.from_iterable(lst) >>> list(new_iter) # [1, 2, 3, 10, 11, 4, 5, 6, 7, 8, 9]
Имеем такой список [1, [[2, 3]], [[10], 11], [[[4, 5], 6], 7], [[[]]], [9]]
. Задача, раскрыть списки разной глубины и получить один линейный список.
Для глобального поглощения списков разной глубины вложенности создадим функцию list_merge()
с аргументом по умолчанию res=[]
и будем использовать рекурсивные вызовы.
Использование в качестве аргумента по умолчанию res=[]
необходимо и обосновано сохранением состояния итогового линейного списка.
>>> def list_merge(lst, res=[]): ... for el in lst: ... list_merge(el) if isinstance(el, list) else res.append(el) ... return res >>> lst = [1, [[2, 3]], [[10], 11], [[[4, 5], 6], 7], [[[]]], [9]] >>> new_lst = list_merge(lst) >>> new_lst # [1, 2, 3, 10, 11, 4, 5, 6, 7, 8, 9]