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

15 投票
4 回答
6658 浏览
提问于 2025-04-16 07:22

有没有一种优雅的方式可以在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 个回答

4

函数封装的一个美妙之处在于,它们可以隐藏一些复杂或不太好看的东西。

如果你需要用到 zipmap,那就自己定义一个吧:

def zipmap(values, functions):
    return [functions[i](values[i]) for i in range(
      len(functions))]
26

这段代码是用来处理一些数据的。它可能会涉及到一些循环、条件判断或者函数调用。简单来说,就是通过一系列的步骤来完成某个任务。

在编程中,我们常常需要把数据从一个地方转移到另一个地方,或者对数据进行一些操作,比如计算、排序等。这段代码就是在做这样的事情。

如果你看到一些看起来复杂的符号或结构,不用担心,慢慢来,理解每一部分的功能就好。编程就像拼积木,先把每个小块弄明白,最后就能拼出完整的图案。

[x(y) for x, y in zip(functions, values)]
25

这些解决方案看起来有点复杂,其实 map 本身就可以把它的参数合并在一起:

map(lambda x,y:x(y), functions, values)

或者,如果你更喜欢使用迭代器的方式:

from itertools import imap
imap(lambda x,y:x(y), functions, values)

撰写回答