#python #dictionary
Вопрос:
У меня есть простой пример, как так:
import numpy as np
func_dict1 = {0: np.sin, 1: np.cos, 2: np.tan}
out = map(func_dict1.get, np.array([0, 2, 0]))
Здесь я выбираю три функции по их ключам словаря. Теперь я хочу передать уникальные аргументы каждой функции следующим образом:
[f(x) for f,x in zip(out, [3,1,2])]
который выводит результат:
[0.1411200080598672, 1.557407724654902, 0.9092974268256817]
Но как я могу это сделать с map
помощью ?
Я думал, что это сработает, но это не так:
map(out, [3,1,2])
Где я ошибаюсь? И есть ли какая-то польза в использовании map
понимания по списку? Мой приор в том, что это быстрее, но я признаюсь, что не являюсь экспертом в этом вопросе.
Ответ №1:
map
предназначен для того, чтобы взять одну функцию и применить ее к каждому элементу в итерационном режиме. Вы применяете разные функции к разным элементам. Я думаю, что понимание списка-это элегантный способ сделать это.
Комментарии:
1. Верно, гранд. Это полезно, я не совсем уверен в правильном использовании
map
в данном случае.
Ответ №2:
ПРЕДУПРЕЖДЕНИЕ: вы, вероятно, не хотите использовать map
, и этот ответ может сбить вас с толку больше, чем помочь ;).
Однако, поскольку вы спросили, как вы можете map
это сделать и поскольку это python, давайте примем вызов: один из способов достичь того, чего вы хотите, — это обернуть ваш out
объект в объект, который можно вызвать (поэтому ведет себя как функция), и при каждом вызове также переходит к next
функции. Например, вот так:
# yours
import numpy as np
func_dict1 = {0: np.sin, 1: np.cos, 2: np.tan}
out = map(func_dict1.get, np.array([0, 2, 0]))
# extend like this
class FuncIterCaller:
def __init__(self, funcs):
self.funcs = funcs
def __call__(self, *args, **kwds):
return next(self.funcs)(*args, **kwds)
res = map(FuncIterCaller(out), [3,1,2])
# to see what's inside:
print(list(res))
Комментарии:
1. Ха, как мило. Я поверю вам на слово, хотя, похоже, это не является
map
задачей 🙂