我在Python中有一些类:
class Class1:
def method(self):
return 1
class Class2:
def method(self):
return 2
以及列表myList
,其元素都是Class1
或Class2
的实例。我想创建一个新列表,其元素是在method
的每个元素上调用的myList
的返回值。我尝试过使用“虚拟”基类
class Class0:
def method(self):
return 0
class Class1(Class0):
def method(self):
return 1
class Class2(Class0):
def method(self):
return 2
但如果我尝试map(Class0.method, myList)
,我就会得到[0, 0, 0, ...]
。我对Python有点新鲜,我听说“鸭子打字”比实际继承更受欢迎,所以这可能是错误的方法。当然,我可以做到
[myList[index].method() for index in xrange(len(myList))]
但我喜欢map
的简洁。有没有办法继续使用map
?
答案 0 :(得分:4)
operator.methodcaller工具正是您所需要的:
map(methodcaller("method"), myList)
或者你可以使用列表理解:
[obj.method() for obj in myList]
答案 1 :(得分:3)
这是最好的:
[o.method() for o in myList]
地图似乎受到人们对Haskell或Lisp的青睐,但是Python有很好的迭代结构,你可以使用它。
答案 2 :(得分:3)
您可以使用
map(lambda e: e.method(), myList)
但我认为这更好:
[e.method() for e in myList]
PS:我认为{em}