[英]Map equivalent for list comprehension
[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
將iterable中的每個項作為單獨的參數應用於callable。 可以使用operator.itemgetter()
對象替換嵌套的生成器表達式,以獲得更多映射優勢:
from itertools import starmap
from operator import itemgetter
starmap(foo, map(itemgetter('fieldA', 'fieldB'), barlist))
像itertools
所有callable一樣,這會生成迭代器,而不是列表。 但是如果你使用的是Python 3,那么map()
也是如此。 如果你使用的是Python 2,那么在這里替換itertools.imap()
map()
可能是一個想法。
正如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")
我們通過itemgetter("fieldA","fieldC")
收到的值。 因此, fieldA
的值將是foo
的第一個參數, fieldC
的值將是foo
的第二個參數。
像這樣的東西。
bar = lambda x: foo(x['fieldA'], x['fieldC'])
map(bar, barlist)
但是,使用地圖而不是列表理解是不可取的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.