-1

我要檢查多個條件的if語句有沒有辦法在Python中的if語句中組合成員比較?

if a: 
    # do something 

多個案件在這種情況下爲真== 1,A == 2,== 3

,而不需要編寫

if a == 1 or a == 2 or a == 3: 
    # do something 

我想這樣

東西
+3

'如果有的話(爲條件的條件==在[1,2,3]):'?但是你的錯誤並不是來自那個代碼。 – jonrsharpe

+1

''帶有多個元素的數組的真值不明確''聽起來像是一個numpy錯誤消息。你是否正確地表示了你的數據? – wwii

+0

@jonrsharpe:應該是'如果在[1,2,3]:' – hop

回答

1

只需添加到其他的答案,你最好的選擇肯定會是這樣的邏輯:

if a in set([1, 2, 3]): 
    #do something 

或甚至更好

if a in {1, 2, 3}: 
    #do something 

我想在這裏強調的事情是,你應該使用set這種情況。查找會更有效率。

另外,python documentation推薦。

常見用途包括成員資格測試,從 序列刪除重複,以及計算的數學運算,例如路口, 集,差,和對稱差

+1

你的第一個構造肯定會顯着*較慢:'set([1,2,3])'比簡單地檢查'[1,2,3]'中的成員資格,因爲它必須每次構建集合* 。使用set-literal!然後編譯器可以優化!的確,'[1,2,3]'中的x和set([1,2,3])中的'x之間的差異比[1,2,3]中的x之間的差異大得多* '和'x in {1,2,3}' –

+0

這就是我提出第二種解決方案的原因。正如我所說的,我的目標是讓他深入瞭解如何輕鬆優化解決方案。但你有一個好點,我會更新。 – scharette

1

最簡單的事情寫的是if a in (1, 2, 3)

什麼你試圖寫可以寫成

if any(a == condition for condition in [1, 2, 3]) 
2

您是在正確的道路上的一種。什麼是需要的是:

if a in [1,2,3]: 
    do something 

作爲替代

if a == 1 or a == 2 or a ==3: 

由於jonrsharpe正確地指出,也許你正試圖

if any(a==condition for condition in [1,2,3]): 

這也是以同樣的方式。

1

The truth value of an array with more than one element is ambiguous看起來像一個numpy錯誤消息。如果a是numpy ndarray並且b包含您正在測試的值,則可以這樣做。

import numpy as np 
a = np.arange(6) 
b = np.array([6,2,9]) 
if np.any(a == b[:, None]): 
    ... 

np.any(a[:,None] == b) 

它利用的broadcasting


你的異常可以使用陣列再現......

>>> if a == b[:, None]: 
    pass 

Traceback (most recent call last): 
    File "<pyshell#281>", line 1, in <module> 
    if a == b[:, None]: 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
>>> 
+0

當然不是標準的python,如果[1,2,3]中的條件[==]條件無效語法 –

+0

確實我的問題是,我的「a」有多個值,我不知道 – vanilla

+1

@香草 - 當發生這樣的意外事件時,通常有助於檢查操作數。一種方法是[catch the exception](https://docs.python.org/3/tutorial/errors.html#handling-exceptions)並在'except'套件中打印內容。另一個策略可能是[使用錯誤消息進行搜索](https://stackoverflow.com/search?q=ValueError%3A+The+truth+value+of+an+array+with+more+than+one+element是+模棱兩可。+用+ a.any()+或+ a.all())。 – wwii

相關問題