16

我正在尝试调用object.method()对象列表。

我已经尝试过了,但无法让它正常工作

newList = map(method, objectList)

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

有没有办法用map()或类似的内置函数来做到这一点?还是我必须使用生成器/列表理解?

编辑您能否解释一下使用此列表理解的优势或对比您的解决方案?

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

3 回答 3

21

newList = map(method, objectList)会呼吁method(object)每个objectobjectlist

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

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

列表理解可能会稍微快一些,因为您不需要 lambda,它有一些开销(在这里讨论了一下)。

于 2013-08-01T17:31:00.797 回答
19

使用operator.methodcaller()

from operator import methodcaller

map(methodcaller('methodname'), object_list)

这适用于所有具有相同方法(按名称)的任何对象列表;列表中是否有不同的类型并不重要。

于 2013-08-01T15:21:58.773 回答
6

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

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)
于 2013-08-01T15:16:52.900 回答