我可以使用python中的map()将“绑定”方法映射到实例列表吗?

时间:2014-01-23 20:34:52

标签: python functional-programming

功能map(func,iterable)可以很容易地应用于普通函数,但如果我想将a_method应用于实例列表,我该怎么办呢?我知道列表推导可以快速完成,但仍然想看看是否存在功能方式并且还感觉到pythonic。

class cls(object):
    def __init__(self,val):
        self.val=val
    def clstest(self,val):
        return self.val==val
a=cls(9)
b=cls(18)
c=cls(19)
lst=[a,b,c]

然后以下工作:list(map(repr,lst))返回

['<__main__.Cls object at 0x00000000070EDB70>',
 '<__main__.Cls object at 0x00000000070EDBE0>',
 '<__main__.Cls object at 0x00000000070EDE80>']

,但list(map(clstest(10),lst))会有错误消息:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-165-f10396f98b58> in <module>()
----> 1 list(map(clstest,lst))

NameError: name 'clstest' is not defined

更新:纠正我在定义课程时的错误。错误消息仍然存在。

4 个答案:

答案 0 :(得分:1)

另一种可能性(在this answer的帮助下)

class cls(object):
    def __init__(self,val):
        self.val=val
    def clstest(self,val):
        return self.val==val
a=cls(9)
b=cls(10)
c=cls(19)
lst=[a,b,c]
# use functools.partial
from functools import partial
list(map(partial(cls.clstest,val=10),lst))

答案 1 :(得分:1)

这是你在找什么?

import operator
lst = [ cls(9), cls(18), cls(19) ]
x = operator.methodcaller('clstest', 10)
map( x, lst )

methodcaller函数创建一个可调用对象,该对象在其参数上调用命名方法,因此例如x(lst[0])lst[0].clstest(10)相同。

答案 2 :(得分:0)

您应该将函数包装在lambda

list(map(lambda instance: instance.clstest(10), lst))

或者正如您所提到的,作为列表理解:

[instance.clstest(10) for instance in lst]

此外,这一行让我哭泣:lst=list([a,b,c])应该是lst = [a,b,c]

答案 3 :(得分:0)

代码中的第一个单词应该是 class ,而不是 def 。 Python中接受的做法是给出 ClassNames cls 通常用于类方法)。而你的缩进需要修复。

这是未经完整的完整答案

class MyClass(object):
    def __init__(self,val):
        self.val=val
    def clstest(self,val):
        return self.val==val

objects = [MyClass(v) for v in (9, 18,19)]
map(lambda o: o.clstest(10), objects)

答案是 - 是的,你可以