Как отнять 1 от всех чисел в списке, одной строкой?

Рейтинг: 2Ответов: 3Опубликовано: 09.07.2023
my_list = [1, 2, 3, 4, 5]
my_list[:] -= 1
print(my_list)

Ответы

▲ 6

Я тоже украду комментарий у ZxNuClear:

my_list = [x - 1 for x in my_list]

У решения есть мелкий недостаток. Вернее два: my_list меняет id в процессе обновления (что иногда полезно и важно, а иногда вредно и ломает программу) и создаётся копия списка в памяти.

Сохранить id можно так (автор вопроса использовал эту конструкцию, значит он хочет сохранить объект?):

my_list[:] = [x - 1 for x in my_list]

Копирование останется. Пробуем удалить и его:

my_list[:] = (x - 1 for x in my_list)

Кажется что не нужна память под список в правой части присваивания, но нет, нужна. my_list[:] = [...] и my_list[:] = (...) делают одно и тоже. В коде Питона сделано так что если слева список[:] а справа не список (или другой контейнер с известной длиной), то генератор из правой части копируют в список. Копия осталась на месте, несмотря на изменение в коде. :(

Но "я хоть попытался..." - Пролетая над гнездом кукушки.

▲ 2

1 способ

my_list = [1, 2, 3, 4, 5]
my_list = [x - 1 for x in my_list]

2 способ

my_list = [1, 2, 3, 4, 5]
my_list = list(map(lambda x: x - 1, my_list))
▲ 1

есть такое приходится делать часто, используйте numpy

import numpy as np


arr = [7, 5, 9, 0]
arr = np.array(arr)
arr -= 1
print(arr)