簡體   English   中英

列表推導的等效地圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM