列表推导的等效地图

时间:2014-05-20 14:57:07

标签: python list-comprehension iterable-unpacking map-function

[foo(item['fieldA'], item['fieldC']) for item in barlist]

是否有相应的地图?

我的意思是,像这样:

map(foo, [(item['fieldA'], item['fieldB']) for item in barlist])

但它不起作用。 好奇。

3 个答案:

答案 0 :(得分:8)

您正在寻找itertools.starmap()

from itertools import starmap

starmap(foo, ((item['fieldA'], item['fieldB']) for item in barlist))

starmap将来自iterable的每个项目作为单独的参数应用于callable。嵌套的生成器表达式可以替换为operator.itemgetter() object以获得更多映射优势:

from itertools import starmap
from operator import itemgetter

starmap(foo, map(itemgetter('fieldA', 'fieldB'), barlist))

itertools中的所有可调用对象一样,这会生成迭代器,而不是列表。但是如果你使用的是Python 3,那么map()也是如此。如果您使用的是Python 2,则可能需要在itertools.imap()替换map()

答案 1 :(得分:4)

正如Martijn解释的那样,没有什么能比itertools.starmap更好。但是,如果您只想使用map,那么您可以模拟内部starmap的内容,例如

map(lambda fields: foo(*fields), ((it['fieldA'], it['fieldC']) for it in bars))

或者你可以使用operator.itemgetter,就像这样

map(lambda fields: foo(*fields),(itemgetter("fieldA","fieldC") for item in bars))

*fields只是解包我们用itemgetter("fieldA","fieldC")收到的值。因此,fieldA的值将是foo的第一个参数,而fieldC的值将是foo的第二个参数。

答案 2 :(得分:2)

像这样。

bar = lambda x: foo(x['fieldA'], x['fieldC'])
map(bar, barlist)

但是,使用地图而不是列表理解是不可取的。