如何在Python中使用map处理可迭代和不可迭代的参数集?
为了举个简单的例子,我不太关心实际应用,只想讲讲实现的过程。假设我创建了一个类,里面有几个方法。我想做一个列表,记录这些方法是否可以被调用。这样我就可以从这个例子开始:
查找一个对象有哪些方法[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))