map()
和列表理解大致相同:
map(function, list1)
[function(i) for i in list1]
如果我们想要使用的函数是一种方法怎么办?
[i.function() for i in list1]
map(.function, list1) # error!
map(run_method(function), list1) # error!
我如何使用map
执行此类操作?
答案 0 :(得分:12)
from operator import methodcaller
map(methodcaller('function'), list1)
methodcaller()
接受其他参数,然后传递给被调用的方法; methodcaller('foo', 'bar', spam='eggs')(object)
相当于object.foo('bar', spam='eggs')
。
如果list1
中的所有对象都是该类型的相同类型或子类,和要调用的方法不带任何参数,则可以传入未绑定的方法到map
作为要调用的函数。例如,要小写列表中的所有字符串,可以使用:
map(str.lower, list_of_strings)
其中str.lower
是str
类型的未绑定方法。
请注意,列表推导在这里并不等同于map()
。 map()
只能执行一个循环,完全使用C. map()
将zip()
多个可迭代参数,而Python 3中的map()
本身就是一个迭代器
另一方面,列表理解可以执行多个(嵌套)循环并添加过滤,左侧表达式可以是任何有效的Python表达式,包括嵌套列表推导。
答案 1 :(得分:1)
您可以使用对象的类型直接调用该方法。
map(lambda x: type(x).function(), list1)
这比更直接的
更令人兴奋map(lambda x: x.function(), list1)
然而,它确实指出,如果Python有一个函数组合运算符,就像f**g(x) == f(g(x))
那样会很好。然后你可以写
map(type**function, list1)