是否存在惯用和/或优雅的Python,用于在值列表中压缩并应用函数列表?
例如,假设您有一个功能列表:
functions = [int, unicode, float, lambda x: '~' + x + '~']
和值列表:
values = ['33', '\xc3\xa4', '3.14', 'flange']
有没有办法将第i个函数应用于第i个值并返回相同长度的转换值的列表,同时避免这种丑陋的列表理解?
[functions[i](values[i]) for i in range(len(functions))] # <- ugly
我想要的是类似zip()
+ map()
(zipmap()
!)的函数列表,其中包含值列表,并将函数应用于其配对值。我认为itertools
可能提供相关的东西,但像imap
和starmap
这样的函数用于将单个函数映射到可迭代的函数,而不是可迭代的函数而不是另一个函数。
答案 0 :(得分:23)
[x(y) for x, y in zip(functions, values)]
答案 1 :(得分:21)
这些解决方案似乎过于复杂:map
已经拉开了它的论点:
map(lambda x,y:x(y), functions, values)
或者,如果您更喜欢迭代器版本:
from itertools import imap
imap(lambda x,y:x(y), functions, values)
答案 2 :(得分:4)
功能封装的一个美妙特征是它们可以隐藏丑陋。
如果您需要zipmap
,请定义它:
def zipmap(values, functions):
return [functions[i](values[i]) for i in range(
len(functions))]
答案 3 :(得分:1)
用于稳健运行的代码将在for循环中执行此操作,以便它可以提供有意义的错误报告:
for i in xrange(num_columns):
try:
outrow.append(functions[i](input_values[i])
except (ValueError, EtcetcError) as e:
self.do_error_reporting(row_number, i, input_value[i], e)
outrow.append(None)