如何在Python中使用map处理可迭代和不可迭代的参数集?

0 投票
3 回答
1454 浏览
提问于 2025-04-16 06:52

为了举个简单的例子,我不太关心实际应用,只想讲讲实现的过程。假设我创建了一个类,里面有几个方法。我想做一个列表,记录这些方法是否可以被调用。这样我就可以从这个例子开始:

查找一个对象有哪些方法
[method for method in dir(object) if callable(getattr(object, method))] 

这个方法很好用,但如果我想试试用map函数,而我的对象是一个不可迭代的东西……

map(callable,map(getattr,object,dir(object)))

为了聚焦真正的问题:

我有一个可以迭代的列表,还有一个不可迭代的东西。有什么好的办法可以让我同时使用不可迭代的东西和可迭代的东西,这样我就能用map函数了?

3 个回答

0

如果你不太明白上面的lambda表达式是干什么的,其实你可以用下面的方式来定义:

def myMap(fun1,obj,iterlist):
        def fun2(x):
            return fun1(obj,x)
        return map(fun2,iterlist)

然后,你可以调用

map(callable,myMap(getattr,object,dir(object)))

比如说:

map(callable,myMap(getattr,myMap,dir(myMap)))

不过,使用lambda写法更符合Python的风格。

0

有时候,使用LC(列表推导式)就是最合适的方法

>>> from itertools import izip, repeat, starmap
>>> map(callable, starmap(getattr, zip(repeat(object), dir(object))))

这个方法也可以,但需要用dir(object)两次

>>> map(callable, map(getattr, repeat(object, len(dir(object))), dir(object)))

最后

>>> from itertools import izip_longest
>>> map(callable, starmap(getattr, izip_longest([], dir(object), fillvalue=object)))
4

我承认我不太明白为什么会这样,因为这个LC(可能指某个代码或功能)是可以正常工作的,但是:

map(lambda x: callable(getattr(object, x)), dir(object))

撰写回答