在Python中的值列表中压缩并应用函数列表

时间:2010-11-20 05:15:11

标签: python

是否存在惯用和/或优雅的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可能提供相关的东西,但像imapstarmap这样的函数用于将单个函数映射到可迭代的函数,而不是可迭代的函数而不是另一个函数。

4 个答案:

答案 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)