Сообщить об ошибке.

Изменение элементов списка срезом в Python

Синтаксис:

sequence[i:j] = iterable

Параметры:

Результат:

  • изменение части элементов последовательности

Описание:

Операция sequence[i:j] = iterable позволяет заменить элементы последовательности по указанному срезу содержимым итерации.

В результате, указанный срез последовательности sequence от индекса i до индекса j заменяется содержимым итерации iterable. Операция замены по срезу дополнит последовательность содержимым итерации, в случае если j - i < len(iterable) или наоборот уменьшит, если `j - i > len(iterable).

Больше об индексации среза читайте в операции получения среза последовательности и смотрите встроенную функцию slice()

Эта операция поддерживаются изменяемыми типами последовательностей.

Пояснение по ключевой фразе - заменяется содержимым итерации iterable:

Если размер среза меньше размера итерации j - i < len(iterable), то произойдет замена указанных в срезе элементов последовательности sequence , а избыточные элементы итерации iterable дополнят последовательность с индекса j на размер len(iterable) - (j - i). Другими словами длина последовательности sequence станет больше.

Если размер среза больше размера итерации j - i < len(iterable), то указанный срез последовательности sequence замениться меньшим количеством элементов итерации iterable. Другими словами длина последовательности sequence станет меньше на j - i - len(iterable).

Если индекс j указанного среза выходит за пределы индексации последовательности j > len(sequence) , то в результате произойдет замена элементов последовательности sequence от индекса i до конца частью содержимого итерации iterable, а оставшиеся элементы iterable расширят последовательность sequence.

Если оба индекса указанного среза i > len(sequence) и j > len(sequence) - выходят за пределы индексов последовательности, то в результате операции произойдет расширение последовательности sequence содержимым итерации iterable. То есть произойдет сложение двух последовательностей sequence и iterable.

Если индексы указанного среза i и j опущены, то в результате операции произойдет замена последовательности sequence содержимым итерации iterable.

Важно. При изменении последовательности срезом с заданным шагом все происходит немного иначе.

Информация по встроенной функции len()

Примеры изменения части списка операцией среза.

>>> x = [1, 4, 7, 10, 13, 16, 19]
>>> x[1:4] = [0, 0, 0]
>>> x
# [1, 0, 0, 0, 13, 16, 19]

>>> x[3:6] = ['one', 'two', 'three']
>>> x
# [1, 0, 0, 'one', 'two', 'three', 19]

>>> x[3:6] = 'one'
>>> x
# [1, 0, 0, 'o', 'n', 'e', 19]

# Вставляем не итерируемый объект
>>> x[3:6] = 20.2
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: can only assign an iterable

# Вставляем список меньшего размера чем срез
>>> x[1:6] = ['foo', 'moo']
>>> x
# [1, 'foo', 'moo', 19]

# Вставляем список большего размера чем срез
>>> x[0:2] = [12, 15, 18, 111, 141, 171]
>>> x
# [12, 15, 18, 111, 141, 171, 'moo', 19]

>>> x = [1, 4, 7, 10, 13, 16, 19]
# индекс j выходит за пределы последовательности
>>> x[5:20] = ['one', 'two', 'three', 'four']
>>> x
# [1, 4, 7, 10, 13, 'one', 'two', 'three', 'four']

# Cрез выходит за пределы последовательности
>>> x[20:] = ['one', 'two', 'three']
>>> x
# [1, 4, 7, 10, 13, 'one', 'two', 'three', 'four', 'one', 'two', 'three']

# Индексы опущены, произойдет замена
>>> x[:] = ['one', 'two', 'three']
>>> x
# ['one', 'two', 'three']

# Вложенные последовательности
>>> x = [[1, 4, 7, 10], [13, 16, 19]]
>>> x[0][1:4] = ['one', 'two', 'three']
>>> x
# [[1, 'one', 'two', 'three'], [13, 16, 19]]