2013-03-29 2 views
2

У меня есть список, который выглядит следующим образом:Применяя ряд функций к списку

lst = [1, 2, 3, 4, 5, 6] 

У меня есть множество функций, каждая с аргументами:

mul = lambda lst, val: [i * val for i in lst] 
add = lambda lst, val1, val2: [i + val1 + val2 for i in lst] 
... 

Я хотел бы создать более высокий которая может принимать любое количество функций, каждая с переменным числом аргументов, а затем применять эту функцию для списка. Это может выглядеть примерно так:

>>> functions([mul, (10)], [add, (10, 100)] 
[120, 130, 140, 150, 160, 170] 

Как это сделать в python?

ответ

4

Это делает то, что вы хотите:

mul = lambda lst, val: [i * val for i in lst] 
add = lambda lst, val1, val2: [i + val1 + val2 for i in lst] 

def functions(lst, *fns): 
    for fn, args in fns: 
     lst = fn(lst, *args) 
    return lst 

lst = [1, 2, 3, 4, 5, 6] 
result = functions(lst, [mul, (10,)], [add, (10, 100)]) 
print result 

производит:

[120, 130, 140, 150, 160, 170] 

Вы хотели бы структурировать функции по-разному:

mul = lambda i, val: i * val 
add = lambda i, val1, val2: i + val1 + val2 

def functions(lst, *fns): 
    for fn, args in fns: 
     lst = [fn(i, *args) for i in lst] 
    return lst 

И как другие указывают : numpy предназначен для выполнения всех и многое другое.

+0

Один очевидный способ, я думаю. : ^) – DSM

+1

Спасибо Ned. Это именно то, что я хочу сделать. В моем фактическом прецеденте использование NumPy невозможно. Большое спасибо за все, что вы сделали - особенно для того, чтобы помочь мне с Unicode! – user1728853

0

Вместо того чтобы изобретать numpy, используйте его!

import numpy as np 

lst = np.arange(1, 7) 
print lst * 10 + 10 + 100 
[120 130 140 150 160 170] 
4

Использование functools.partial, прикованный цепью. Например,

from functools import partial 

lst = [1, 2, 3, 4, 5, 6] 

mul = lambda lst, val: [i * val for i in lst] 
add = lambda lst, val1, val2: [i + val1 + val2 for i in lst] 

mul10 = partial(mul, val=10) 
add_10_100 = partial(add, val1 = 10, val2 = 100) 
print add_10_100(mul10(lst)) 

[120, 130, 140, 150, 160, 170] 
+0

Спасибо. Можете ли вы привести пример того, как я могу его использовать? – user1728853

+0

см. Мой обновленный ответ – shx2

+1

Это было бы лучше с 'reduce':' reduce (lambda lst, f: f (lst), [partial (mul, val = 10), partial (add, val1 = 10, val2 = 100) ], диапазон (1,7)) ' – sfstewman

Смежные вопросы