如何使用map()在对象列表上调用类方法

时间:2013-08-01 15:14:11

标签: python python-2.7

我试图在对象列表上调用object.method()

我试过这个但是无法让它正常工作

newList = map(method, objectList)

我收到错误method is not defined但我知道这是因为它是一个类方法而不是本地函数。

有没有办法用map()或类似的内置函数执行此操作?或者我是否必须使用生成器/列表理解?

编辑您是否还可以解释使用此列表理解的优势或对比?

newList = [object.method() for object in objectList]

3 个答案:

答案 0 :(得分:14)

使用operator.methodcaller()

from operator import methodcaller

map(methodcaller('methodname'), object_list)

这适用于所有具有相同方法的对象列表(按名称);如果列表中有不同类型,则无关紧要。

答案 1 :(得分:10)

newList = map(method, objectList)会在method(object)的每个object上致电objectlist

使用map执行此操作的方法需要lambda函数,例如:

map(lambda obj: obj.method(), objectlist)

列表理解可能略微更快,因为您不需要lambda,它有一些开销(稍微讨论here)。

答案 2 :(得分:3)

如果列表的内容都是同一个类的实例,则可以在方法名称前加上类名称。

class Fred:
    def __init__(self, val):
        self.val = val
    def frob(self):
        return self.val

freds = [Fred(4), Fred(8), Fred(15)]
print map(Fred.frob, freds)

结果:

[4, 8, 15]

如果列表的元素是指定类的子类,也可以这样做。但是,即使在子类中重写了该方法,它仍将调用该方法的指定实现。例如:

class Fred:
    def __init__(self, val):
        self.val = val
    def frob(self):
        return self.val

class Barney(Fred):
    def frob(self):
        return self.val * 2

freds = [Fred(4), Barney(8), Barney(15)]
#You might expect the barneys to return twice their val. ex. [4, 16, 30]
#but the actual output is [4, 8, 15]
print map(Fred.frob, freds)