[foo(item['fieldA'], item['fieldC']) for item in barlist]
有没有对应的地图?
我的意思是,像这样:
map(foo, [(item['fieldA'], item['fieldB']) for item in barlist])
但它不起作用。只是好奇。
[foo(item['fieldA'], item['fieldC']) for item in barlist]
有没有对应的地图?
我的意思是,像这样:
map(foo, [(item['fieldA'], item['fieldB']) for item in barlist])
但它不起作用。只是好奇。
您正在寻找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()
。
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
。
像这样的东西。
bar = lambda x: foo(x['fieldA'], x['fieldC'])
map(bar, barlist)
尽管如此,使用地图而不是列表理解是相当不可取的。