如何将一组数据映射到一组函数?

3

我有如下的Python代码:

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

如何调用每个函数并将对应索引处的数据作为参数传递给函数? 现在我正在使用以下代码:
result = []
for i, func in enumerate(funcs):
    result.append(func(data[i]))

map(funcs, data)不能用于函数列表(是否有更简单的内置函数可以实现此功能?)

5个回答

9
您可以使用 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)]

注意:* 如果您使用的是Python 2.x且列表非常长,请使用itertools.izip


3

map()可以处理函数序列,但可能不是你想象的那样:

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

result = list(map(lambda f,d: f(d), funcs, data))
# or
result = list(map(lambda d,f: f(d), 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']
>>> 

2

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


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

不需要编写函数。只需采用列表推导式解决方案之一,并使用生成器表达式。(f(x) for f, x in zip(funcs, data)) - Glenn Maynard
我认为将函数编写成可放入实用模块更好。我假设这种生成可能会发生多次。因此,最好不要内联生成器,因为生成器无法重新启动,而必须“重新生成”。然后主模块变得更加简洁,代码更易于重用。我还使用了str样式的人类可读打印字符串返回。这可以轻松转换为对象。 - Tony Veijalainen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接