在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
可能会提供一些相关的功能,但像 imap
和 starmap
这样的函数是用来对一个可迭代对象应用单个函数的,而不是对一组函数应用到另一组可迭代对象上。
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)