在Python中使用map-on方法

在Python中使用map-on方法,python,map,Python,Map,我有一些Python类: class Class1: def method(self): return 1 class Class2: def method(self): return 2 以及一个列表myList,其元素都是Class1或Class2的实例。我想创建一个新列表,其元素是对myList的每个元素调用的method的返回值。我尝试过使用“虚拟”基类 class Class0: def method(self):

我有一些Python类:

class Class1:
    def method(self):
        return 1
class Class2:
    def method(self):
        return 2
以及一个列表
myList
,其元素都是
Class1
Class2
的实例。我想创建一个新列表,其元素是对
myList
的每个元素调用的
method
的返回值。我尝试过使用“虚拟”基类

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有点陌生,我听说“duck-typing”比实际的继承更受欢迎,所以这可能是错误的方法。当然可以

[myList[index].method() for index in xrange(len(myList))]
但是我喜欢
map
的简洁。有没有办法继续使用
map
进行此操作?

这是最好的:

[o.method() for o in myList]
Map似乎受到了渴望Haskell或Lisp的人们的青睐,但Python有很好的迭代结构,您可以使用

map(lambda e: e.method(), myList)
但我认为这样更好:

[e.method() for e in myList]

注:我认为永远都不需要
范围(len(collection))

这个工具正是您想要的:

map(methodcaller("method"), myList)
或者,您可以使用列表:

[obj.method() for obj in myList]

这个比
attrgetter
itemgetter
使用得少很多,但我喜欢它+1.Methodcaller在传递方法名称之外的参数时更有趣:
map(Methodcaller('replace','big','mage'),句子)
。有趣。我以前从未见过
methodcaller
。我想我遇到过一些情况,其中我的选择是
range(len(collection))
或使用
枚举
丢弃值部分。。。但是这些情况非常罕见,通常意味着代码无论如何都需要重新分解……哎呀,忘了你可以循环实际对象,而不是通过索引获取它们。不过,我确实喜欢
lambda
,特别是因为我的代码实际上是用于Scheme解释器的!