2017-05-24 58 views
1

我有以下列表:冷凝if語句

languages =["java", "haskell", "Go", "Python"] 
animals = ["pigeon", "python", "shark"] 
names = ["Johan","Frank", "Sarah"] 

我想了解在所有三個以下列表中是否存在蟒蛇。下面的if語句就是我使用「in」方法和「and」運算符創建的。

if("Python" in languages and "Python" in animals and "Python" in names) 

有沒有辦法將這個語句壓縮成更小的長度?
I.E.

if("Python" in languages and in animals and in names) 

回答

6

可避免重蹈"Python"

if all("Python" in L for L in [languages, animals, names]): 

但是,這不是短得多。

+0

有沒有辦法使用範圍內的一個方法,一個方法是什麼?即「蟒蛇」與L.lower()的比較? –

+0

是的,L''中的''Python''部分可以用L.lower()'中的'「python」或任何表達式替換,儘管它們中的一些需要包圍括號或括號。 –

4

考慮:

if all("Python" in x for x in (languages, animals, names)): 
2

我不認爲Python有任何語法糖特別是這樣的,但是這取決於你有多少名單有,你可以不喜歡

if all("Python" in x for x in [languages, animals, names]) 

就其本身而言,它可能是一個有點比更詳細你的and s,但是如果你有大量的列表,或者你已經有一個列表的列表,那麼它應該節省一些空間,恕我直言,它更直接地清楚if語句的目標是什麼。

5

如果這是你希望重複做一個測試,這將是更有效的預先計算的列表的交集:一個

lanimes = set(languages) & set(animals) & set(names) 

if "Python" in lanimes: 

(該in操作是O(n)列表,O(1)爲一組)。

+0

對於經常重複的操作是完全有意義的。對於一次性支票,建立套餐需要花費比列表的全部掃描更長的時間來進行檢查。 – 9000

+0

我把'lanimes'當作'set()'。它必須檢查每個列表。 –

+1

@RahulKP:是的,這裏預計會有一個空集,因爲樣本列表中不包含任何共同的元素。 – jasonharper

0

簡短回答:不,語言語法不允許這樣做。

如果你真的要削減重複'Python',你可以在你的,如果條件中使用這樣的事情:

all('Python' in p for p in (languages, animal, names)) 

我也建議,也許你可以重新評估的設計,使你的代碼更靈活。理解和生成器表達式是一個好的開始。