2015-05-12 75 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) 

我只是想知道如果有一個更Python的方式來做到這一點。

沒有單獨的功能?通過單一表達?

回答

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相當Python化:

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

def compose_many(*funcs): 
    return reduce(compose, funcs) 
相關問題