2010-10-03 148 views
2

我有以下Python代碼:如何將數據元組映射到函數元組?

data = ['1', '4.6', 'txt'] 
funcs = [int, float, str] 

如何調用數據每種功能都相應的指標作爲參數傳遞給函數? 現在我使用的代碼:

result = [] 
for i, func in enumerate(funcs): 
    result.append(func(data[i])) 

圖(funcs中,數據)不具有功能的元組工作(有沒有內建功能做簡單的

回答

8

你可以use zip *?許多序列結合在了一起:

zip([a,b,c,...], [x,y,z,...]) == [(a,x), (b,y), (c,z), ...] 

,那麼你可以在這個新的序列重複,使每一個功能上的相應數據適用,因爲你只是想將其收集到列表中,。比for循環更好:

result = [f(x) for f, x in zip(funcs, data)] 

注:*使用itertools.izip如果你正在使用Python 2.x和列表非常長)

2

[f(d) for d,f in zip(data, funcs)]

2
>>> data = ['1', '4.6', 'txt'] 
>>> funcs = [int, float, str] 
>>> result = [funcs[pos](x) for pos, x in enumerate(data)] 
>>> result 
[1, 4.5999999999999996, 'txt'] 
>>> 
0

如果您需要逐個值,也可以爲值創建生成器:

def my_funcvals(funcs,vals): 
    return ("%s(%r) = %r" %(f.__name__,d, f(d)) for d,f in zip(data, funcs)) 

data = ['1', '4.6', 'txt'] 
funcs = [int, float, str] 

for result in my_funcvals(funcs, data): 
    print result 
+0

這是沒有必要寫一個函數。只要選擇列表理解解決方案並使用生成器表達式即可。 '(f(x)for f,x in zip(funcs,data))' – 2010-10-03 07:42:43

+0

我認爲編寫可以放入實用程序模塊的函數會更好。我認爲可能這種世代不止一次發生。所以最好不要內聯發電機,因爲發電機不能重新啓動,但必須「重新生成」。然後主模塊變得更有意義,代碼更容易重用。我也做了str樣式的人類可讀的打印字符串返回。這可以很容易地轉化爲對象。 – 2010-10-03 08:09:01

2

map()與功能序列的工作,儘管也許不是在你的思維方式:

data = ['1', '4.6', 'txt'] 
funcs = [int, float, str] 

result = map(lambda f,d: f(d), funcs, data) 
# or 
result = map(lambda d,f: f(d), data, funcs)