我想編寫一個小程序,用一個所需的值替換數組中的某些值。該數組(稱爲「arr」)包含大約10,000個整數類型的元素,我想用1替換數字3,4和5.python中的行理解
我寫了下面的代碼,但它沒有執行所需的功能。有人能幫我弄清楚我正在製造的邏輯錯誤嗎?謝謝!
a=[1 if x==3|x==4|x==5 else x for x in arr]
我想編寫一個小程序,用一個所需的值替換數組中的某些值。該數組(稱爲「arr」)包含大約10,000個整數類型的元素,我想用1替換數字3,4和5.python中的行理解
我寫了下面的代碼,但它沒有執行所需的功能。有人能幫我弄清楚我正在製造的邏輯錯誤嗎?謝謝!
a=[1 if x==3|x==4|x==5 else x for x in arr]
邏輯或爲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)
你現在正在做的事叫做:bitwise OR
。您應該使用邏輯或:or
。
更好的是,您可以使用in
運算符來測試。
a = [1 if x in (3,4,5) else x for x in arr]
這就像一個魅力!我會牢記這一點。謝謝 – Ayush
雖然很小,但應該使用集合「{3,4,5}」而不是元組 – acushner
如果'timeit'是可信的,我發現元組的含義比set-contains快2.5倍。大多數情況下(我猜測)是因爲迭代3個項目並檢查而不是獲取哈希值,然後迭代,然後檢查會更快。 – SuperSaiyan
哦!非常感謝 – Ayush