如何使用pythons映射与不可迭代和可迭代的参数集?

时间:2010-11-10 22:33:35

标签: python

举一个简单的例子,我不关心实用性,只关心实现。假设我用一些方法创建了一些类。我想创建一个包含它们是否可调用的列表。所以我可以从这个例子: Finding what methods an object has

[method for method in dir(object) if callable(getattr(object, method))] 

它的功能很棒,但是如果对它来说,我想使用map并且我有对象,这是一个不可迭代的项目...

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

专注于真正的问题:

我有一个可迭代列表和一个不可迭代的项目。什么是最好的解决方案,让我使用一些不可迭代的项目和一个可迭代的项目,以便我可以利用地图?

3 个答案:

答案 0 :(得分:2)

我承认不理解为什么,因为LC工作,但是:

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

答案 1 :(得分: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更加pythonic。

答案 2 :(得分: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)))