2016-08-15 85 views
-1

我有兩個python listsAB等長,每個只包含布爾值。是否有可能獲得第三個列表C其中C[i] = A[i] and B[i]0 <= i < len(A)而不使用循環?Elementwise和python list

我嘗試以下

C = A and B

但也許它給人的名單B

我也試過

C = A or B

這給第一個列表

我知道它可以很容易地使用for循環單線如C = [x and y for x, y in zip(A, B)]

+0

如果你不想循環,你可能想看看numpy。 – ayhan

+1

@ayhan它也使用循環,只是將它們隱藏在C代碼中。 – DeepSpace

+0

@ShamshadAlam您將必須有一個循環,無論是隱式循環還是顯式循環。爲什麼這有關係? – DeepSpace

回答

2

我建議你使用numpy來對數組使用這些謂詞。現在,我不認爲你可以避免循環來實現你想要的,但是...如果你不考慮作爲循環形式的映射或枚舉,你可以做這樣的事情(C1):

A = [True, True, True, True] 
B = [False, False, True, True] 

C = [x and y for x, y in zip(A, B)] 
C1 = map(lambda (i,x): B[i] and x, enumerate(A)) 
C2 = [B[i] and x for i,x in enumerate(A)] 

print C==C1==C2 
2

通過使用map,您可以在沒有顯式循環的情況下執行此操作,該循環以C速度在內部執行循環。當然,實際的and操作仍然以Python的速度進行,所以我認爲它不會節省很多時間(與Numpy基本上做同樣的事情相比,它不僅能以C速度進行循環,還可以以C的速度執行操作。當然,還有在本地Python列表& Numpy數組之間轉換的開銷。

演示:

from operator import and_ 

a = [0, 1, 0, 1] 
b = [0, 0, 1, 1] 
c = map(and_, a, b) 
print c 

輸出

[0, 0, 0, 1] 

注意,and_函數執行按位操作,但因爲你是在布爾值操作,應該是好的。

0

簡單的答案:你不能。

除了在平凡的方式,即通過調用一個函數,爲你做這個,使用循環。如果你想要這種很好的語法,你可以按照建議使用庫:map,numpy等。或者你可以編寫自己的函數。

如果您正在尋找的是句法上的便利,Python不允許爲列表等內置類型重載運算符。

哦,你可以使用遞歸,如果這對你來說不是一個循環。

0

是否有可能獲得第三列表C其中C[i] = A[i] and B[i]0 <= i < len(A)不使用循環?

種類:

class AndList(list): 
    def __init__(self, A, B): 
     self.A = A 
     self.B = B 
    def __getitem__(self, index): 
     return self.A[index] and self.B[index] 

A = [False, False, True, True] 
B = [False, True, False, True] 
C = AndList(A, B) 

print isinstance(C, list) and all(C[i] == (A[i] and B[i]) 
            for i in range(len(A))) 

打印True