Какая встроенная функция python может применить некоторую функцию к каждому элементу списка на месте?

#python #python-3.x #list

#питон #python-3.x #Список

Вопрос:

У меня есть функция sqr(n) и массив списков. Существует ли встроенная функция python, которая применяет sqr (n) к каждому элементу массива на месте (элементы меняются внутри массива)? Также требуются некоторые трюки с функцией map() или другими встроенными функциями.

Конечно, это можно сделать с помощью функции map(), но она создает итератор, и вы получаете новый список (старый список не меняется).:

 def sqr(n):
    return n ** 2

array = [1, 2, 3, 4, 5]
array = list(map(sqr, array)) # have to reassign name to new list but elements don't change in old one.
print(array) # output: [1, 4, 9, 16, 25]
 

Я хочу что-то вроде этого:

 def sqr(n):
    return n ** 2

array = [1, 2, 3, 4, 5]
some_built_in_function(sqr, array)
print(array) # output: [1, 4, 9, 16, 25]
 

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

1. Я так не думаю, списки ars неизменны

2. список @WasifHasan не является неизменяемым

3. Я не думаю, что есть встроенная функция, которая это делает.

Ответ №1:

Встроенной функции нет, но вы можете добиться того же результата, используя map назначение и срез.

 array[:] = map(sqr, array)
 

(Если вам нужно выражение, а не оператор, вы можете использовать чудовище

 array.__setitem__(slice(None), map(sqr, array))
 

по сути, так реализуется назначение фрагмента.
)

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

1. Возможно, Python нужен новый оператор присваивания : array [:]= sqr 🙂

2. Ну, это то, для чего numpy в значительной степени

3. К сожалению, это приводит к созданию временного списка, который немедленно отбрасывается, правильно? Это может иметь значение в некоторых приложениях.

4. @MarkRansom Нет, этого нет в Python 3, где map возвращает итератор, а присвоение фрагменту списка не создает новый список.

5. Да, я думаю, это то, что я хотел, спасибо 🙂

Ответ №2:

Встроенной функции нет, но ее легко написать самостоятельно:

 def mapinplace(l, fun):
    for i, val in enumerate(l):
        l[i] = fun(val)

array = [1, 2, 3, 4, 5]
mapinplace(array, sqr)
 

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

1. Или l[:] = map(fun, l) .

Ответ №3:

Поскольку вы, скорее всего, работаете с числами, я опубликую обязательное решение numpy. Numpy не совсем встроенный, но он довольно близок: @ например, оператор в python был создан для numpy.

Это решение будет доступно только в том случае, если входные данные представляют собой массив numpy, а не список:

 np.square(x, out=x)
 

Большинство элементарных операций numpy могут быть выполнены на месте следующим образом.

Ответ №4:

Для достижения этой цели вы можете использовать понимание списка следующим образом

 array = [1, 2, 3, 4, 5]
array = [i**2 for i in array]
print(array)
 

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

1. Это создает новый список, а не изменяет исходный список на месте. Он просто присваивает новому списку исходное имя, как только оно будет завершено. Различие имеет значение, если вы хотите изменить список, который был передан функции в качестве аргумента, поскольку присвоение параметру не влияет на исходный список.

2. Понимание списка фактически такое же, как list(map(sqr, array)) и у ОП, упомянутого в вопросе.