2009-12-07 85 views
1

這是我的一段代碼。 Lambda接受3個參數,我想將它們作爲位置參數的元組傳遞,但顯然map將它們作爲單個參數提供。如何在地圖中傳遞項目作爲參數列表?

我該如何在底部提供這些元組作爲參數列表? (我知道我可以重寫拉姆達,但它會成爲沒有得到很好的可讀性)

adds = map((lambda j, f, a: 
     j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''), 
     ((' ', ' -not -path "{0}" ', 'exclude'), 
     (' -or ', '-path "{0}"', 'include'))) 

回答

3

嘗試把他們周圍的括號

adds = map((lambda (j, f, a): 
    j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''), 
    ((' ', ' -not -path "{0}" ', 'exclude'), 
    (' -or ', '-path "{0}"', 'include'))) 
+0

GREAT!簡直不敢相信! – 2009-12-07 09:11:32

+2

請注意,此方法在Python> 3.0中無效,此時不再支持此類型的參數解構。 函數 F(A,(B,C): 返回+ B + C要被寫入 需要 F(A,b_c): B,C = b_c 返回A + B + C 問候, Rickard – Rickard 2009-12-07 11:18:16

1

的一種方法是重寫的列表理解:

adds = [ 
    j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else '' 
    for j, f, a in 
    ((' ', ' -not -path "{0}" ', 'exclude'), 
    (' -or ', '-path "{0}"', 'include'))] 
5

map()描述:

map(function, iterable, ...)

將函數應用於每個可迭代項並返回結果列表。 如果傳遞附加的迭代參數,函數必須採用多個參數並應用於所有迭代的並行項目。如果一個迭代比另一個更短,則假定它被擴展爲無項目。如果函數爲None,則假定身份函數;如果有多個參數,則map()返回一個由包含所有迭代項(一種轉置操作)中相應項目的元組構成的列表。可迭代的參數可以是一個序列或任何可迭代的對象;結果總是一個列表。

您需要將參數放在並行列表或元組中,並將它們傳遞給map()作爲3次迭代。

+0

是的,這是正確的,但代碼(元組)將是不可讀的。 – 2009-12-07 09:17:28

3

另一種方法是使用itertools.starmap它接受,壓縮前的論點:

adds = itertools.starmap((lambda j, f, a: 
    j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''), 
    ((' ', ' -not -path "{0}" ', 'exclude'), 
    (' -or ', '-path "{0}"', 'include'))) 
相關問題