Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Удаление элементов списка через срез

#python #python_3x


Удаляю элементы путем присвоения срезу пустого списка. Все работает. Но стоит задать
шаг среза и выскакивает ошибка. В чем дело?

>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> a[0:3] = []
>>> a
[4, 5, 6, 7, 8]

>>> a[0:4:2] = []
ValueError: attempt to assign sequence of size 0 to extended slice of size 2

    


Ответы

Ответ 1



Можно использовать инструкцию del: >>> a = [-1, 1, 66.25, 333, 333, 1234.5] >>> del a[0] >>> a [1, 66.25, 333, 333, 1234.5] >>> del a[2:4] >>> a [1, 66.25, 1234.5] >>> del a[:] >>> a []

Ответ 2



Данная конструкция не работает, потому что вы берёте срез и на его место хотите поместить пустой список, а пайтон ждёт от вас список размерности среза. Об этом вам сообщает ошибка: ValueError: attempt to assign sequence of size 0 to extended slice of size 2 a[0:4:2] = [[], []] # [[], 2, [], 4, 5, 6, 7, 8] a[::2] = [[], [], [], []] # [[], 2, [], 4, [], 6, [], 8]] Почему запись вида a = [] то есть запись без применения шага не выдаёт ошибок? Дело в том, что в данном случае после = мы указываем новую ссылку для массива - []. То есть ссылку на пустой массив. И делая такую запись, мы просто заменяем ссылку у переменной a с текущего непустого массива на пустой. А срез [start:end:step] - это массив ссылок на элементы массива, и для того чтобы заменить ссылки в нём на какие-либо другие, то нам, естественно, нужен массив такой же размерности, как и срез. a[::2] = [None for x in range(len(a[::2]))] # [None, 2, None, 4, None, 6, None, 8]

Комментариев нет:

Отправить комментарий