8

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呢?

4

2 回答 2

16

你会使用operator.methodcaller()

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()多个可迭代参数,并且map()在 Python 3 中本身就是一个迭代器。

另一方面,列表推导可以执行多个(嵌套)循环并添加过滤,左侧表达式可以是任何有效的 Python 表达式,包括嵌套列表推导。

于 2014-02-16T16:47:16.687 回答
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)
于 2014-02-16T17:47:49.707 回答