2015-05-12 3 views
3

Скажем, у меня есть список с элементами content = ['121\n', '12\n', '2\n', '322\n'] и список с функциями fnl = [str.strip, int].Python: применить список функций к каждому элементу в списке

Поэтому мне нужно применить каждую функцию от fnl к каждому элементу от content последовательно. Я могу сделать это несколькими звонками map.

Другой способ:

xl = lambda func, content: map(func, content) 
for func in fnl: 
    content = xl(func, content) 

Я просто интересно, если есть более вещий способ сделать это.

Без отдельной функции? Одним выражением?

ответ

10

Вы можете использовать reduce() function в список понимание здесь:

[reduce(lambda v, f: f(v), fnl, element) for element in content] 

Демо:

>>> content = ['121\n', '12\n', '2\n', '322\n'] 
>>> fnl = [str.strip, int] 
>>> [reduce(lambda v, f: f(v), fnl, element) for element in content] 
[121, 12, 2, 322] 

Это применит каждую функцию по очереди к каждому элементу, как если бы вы вложили вызовы; для fnl = [str.strip, int], что соответствует int(str.strip(element)).

В Python 3, reduce() был перемещен на functools module; для совместимости вперед, вы можете импортировать его из этого модуля с Python 2.6 года:

from functools import reduce 

results = [reduce(lambda v, f: f(v), fnl, element) for element in content] 

Обратите внимание, что для функции int(), это не имеет значения, если есть дополнительные пробелы вокруг цифр; int('121\n') работает без снятия новой строки.

1

Вы описываете основное использование списка понимания:

>>> content = ['121\n', '12\n', '2\n', '322\n'] 
>>> [int(n) for n in content] 
[121, 12, 2, 322] 

Примечание Вам не нужно вызов strip преобразовать в целое здесь, некоторые пробелы обрабатываются в порядке.

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

def compose(f1, f2): 
    def composition(*args, **kwargs): 
     return f1(f2(*args, **kwargs)) 
    return composition 

def compose_many(*funcs): 
    return reduce(compose, funcs) 
Смежные вопросы