2016-07-28 45 views
0

我有兩個列表: a=[1,2,3]b=[a,b,c]如何爲每個用於兩個列表的zip的迭代調用函數?

我想對那些兩次,每次zip調用一個函數,而不是做一個平凡的方式中一個for循環。有沒有pythonic的方式?我試着用map

map(func(i,v) for i,v in zip(a,b))

,但它不工作

+2

*它不起作用*這是怎麼回事?請顯示您嘗試過的結果 –

+2

以及爲什麼這些結果不符合您(您的預期輸出/行爲是什麼) –

+1

要使用地圖,您只需指定'map(func,a,b)'。或者你可以使用你在列表理解中所寫的內容。但是,如果你不想收集你的函數的結果,for循環將會更快更明確地表達你的意圖。 –

回答

0

如果功能func不返回任何東西,你可以使用:

any(func(i, v) for i,v in zip(a, b)) 

將返回False,但不會累積的結果。

由於any()被用於其副作用,因此這不會被認爲是「Pythonic」,因此不是非常明確。

1

列表理解總是會更快或相當於map。如果您在修真的結果追加到列表中(如上例),那麼理解也比一個for loop更快:

a = [1, 2, 3] 
b = ['a', 'b', 'c'] 
c = [] 

def foo(x, y): 
    global c 
    result = x * y 
    c.append(result) 
    return result 


>>> c 
[] 

>>> [foo(x, y) for x, y in zip(a, b)] 
['a', 'bb', 'ccc'] 

>>> c 
['a', 'bb', 'ccc'] 
+1

該函數不返回任何內容,它處理文件 – curious

+0

@curious在這裏沒有看到任何文件。這個函數確實會返回一個值。 –

+0

我的功能我的意思是什麼都沒有返回。它對文件做了一些事情。那麼爲什麼要使用列表理解呢? – curious

5

的Python的方式 for循環:

for i, v in zip(a, b): 
    func(i, v) 

清晰,簡潔,可讀。什麼是不喜歡?

相關問題