2016-06-22 33 views
1

我想編寫一個小程序,用一個所需的值替換數組中的某些值。該數組(稱爲「arr」)包含大約10,000個整數類型的元素,我想用1替換數字3,4和5.python中的行理解

我寫了下面的代碼,但它沒有執行所需的功能。有人能幫我弄清楚我正在製造的邏輯錯誤嗎?謝謝!

a=[1 if x==3|x==4|x==5 else x for x in arr] 

回答

1

邏輯或爲or,不||是按位或。這個列表理解應該寫成

a = [1 if x == 3 or x == 4 or x == 5 else x for x in arr] 

a = [1 if x in (3, 4, 5) else x for x in arr] 

像NumPy的圖書館使用|的廣播邏輯,或者因爲or不能超載,但即使是這樣,你通常需要圓括號您的比較覆蓋|的高優先級。如果你使用的是NumPy,那麼應該這樣做,而不是列表理解,你應該這樣做:

a = np.where((arr == 3) | (arr == 4) | (arr == 5), 1, arr) 
+0

哦!非常感謝 – Ayush

3

你現在正在做的事叫做:bitwise OR。您應該使用邏輯或:or

更好的是,您可以使用in運算符來測試。

a = [1 if x in (3,4,5) else x for x in arr] 
+0

這就像一個魅力!我會牢記這一點。謝謝 – Ayush

+0

雖然很小,但應該使用集合「{3,4,5}」而不是元組 – acushner

+0

如果'timeit'是可信的,我發現元組的含義比set-contains快2.5倍。大多數情況下(我猜測)是因爲迭代3個項目並檢查而不是獲取哈希值,然後迭代,然後檢查會更快。 – SuperSaiyan