2010-10-03 80 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)