2011-10-13 141 views
21

我需要做的事情,它的功能相当于此:Python的map函数可以调用对象成员函数吗?

for foo in foos: 
    bar = foo.get_bar() 
    # Do something with bar 

我的第一直觉是使用map,但这并没有工作:

for bar in map(get_bar, foos): 
    # Do something with bar 

就是我试图完成可能与map?我需要使用列表理解吗?什么是这个最Python的成语?

+3

为什么不使用列表理解? – agf

回答

35

或者与lambda

for bar in map(lambda foo: foo.get_bar(), foos): 

methodcaller

import operator 
get_bar = operator.methodcaller('get_bar') 
for bar in map(get_bar, foos): 

或与发电机表达式:

for bar in (foo.get_bar() for foo in foos): 
+8

按Pythonic的相反顺序排列。 – agf

+12

另外,'map(Foo.get_bar,foos)'其中'Foo'是'foos'中对象的类。 – agf

+0

因为我意识到我需要在代码中执行一些转换,所以我决定使用lambda表达式,并且'Bar's需要进行字符串化和小写。 :) –

7

你想要operator.methodcaller()。或者,当然,列表或发电机的理解。

+0

我猜在新版本的Python中首选列表推导是对的,对吧?如果您更新了包含示例代码的示例代码,我会很乐意接受您的答案。 :) –

+0

@JoshGlover“新版本的Python”?他们至少回到2.3。 – agf

+0

列表解析是在Python 2.0中添加的。 –

1

这修改后的代码将工作:

for bar in map(lambda f: f.get_bar(), foos): 
# Do something with bar 

这里提供了lambda函数。简单地提供get_bar不起作用,因为它只能通过类的实例(f.get_bar())访问,而不能自行访问。

1

您可以使用拉姆达

for bar in map(lambda foo: foo.get_bar(), foos): 
    # Do something with bar 
1

我觉得最彻底的方法是完全-loop放弃for并用一个列表理解:

bars = [foo.get_bar() for foo in foos] 

这个答案是接近一些其他答案但不同之处在于该列表实际上被返回并且不在随后的循环中使用。根据你对bars的处理,你可以使用列表理解。

我不认为map函数lambdas是特别可读的,除了map的开销是相当可观的。

相关问题