Сопоставьте список функций со списком аргументов в python

#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 задачей 🙂