#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))
и у ОП, упомянутого в вопросе.