我有兩個python lists
A
和B
等長,每個只包含布爾值。是否有可能獲得第三個列表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)]
。
我有兩個python lists
A
和B
等長,每個只包含布爾值。是否有可能獲得第三個列表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)]
。
我建議你使用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
通過使用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_
函數執行按位和操作,但因爲你是在布爾值操作,應該是好的。
簡單的答案:你不能。
除了在平凡的方式,即通過調用一個函數,爲你做這個,使用循環。如果你想要這種很好的語法,你可以按照建議使用庫:map,numpy等。或者你可以編寫自己的函數。
如果您正在尋找的是句法上的便利,Python不允許爲列表等內置類型重載運算符。
哦,你可以使用遞歸,如果這對你來說不是一個循環。
是否有可能獲得第三列表
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
。
如果你不想循環,你可能想看看numpy。 – ayhan
@ayhan它也使用循環,只是將它們隱藏在C代碼中。 – DeepSpace
@ShamshadAlam您將必須有一個循環,無論是隱式循環還是顯式循環。爲什麼這有關係? – DeepSpace