我试图在对象列表上调用object.method()
。
我试过这个但是无法让它正常工作
newList = map(method, objectList)
我收到错误method is not defined
但我知道这是因为它是一个类方法而不是本地函数。
有没有办法用map()
或类似的内置函数执行此操作?或者我是否必须使用生成器/列表理解?
编辑您是否还可以解释使用此列表理解的优势或对比?
newList = [object.method() for object in objectList]
答案 0 :(得分:14)
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)