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

有没有对应的地图?

我的意思是,像这样:

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

但它不起作用。只是好奇。

4

3 回答 3

8

您正在寻找itertools.starmap()

from itertools import starmap

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

starmap将可迭代的每个项目作为单独的参数应用于可调用。嵌套的生成器表达式可以用一个operator.itemgetter()对象替换,以获得更好的映射效果:

from itertools import starmap
from operator import itemgetter

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

像 中的所有可调用对象一样itertools,这会产生一个迭代器,而不是一个列表。但是,如果您使用的是 Python 3,那么map()无论如何。如果您使用的是 Python 2,那么在这里换掉可能是个好map()主意itertools.imap()

于 2014-05-20T14:59:52.350 回答
4

itertools.starmap就像 Martijn 解释的那样,没有什么比这更好的了。但是如果你喜欢使用 only 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

于 2014-05-20T15:11:10.670 回答
2

像这样的东西。

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

尽管如此,使用地图而不是列表理解是相当不可取的。

于 2014-05-20T15:01:30.453 回答