2017-05-24 7 views
1
私は次のリストを持っている

凝縮if文

私はPythonは、以下のリストの3つのすべてに存在するか否かを知りたい
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.

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

答えて

6

をあなたは"Python"の繰り返しを避けることができます。

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

しかし、これははるかに短いではありません。

+0

ありますか?すなわち "python"とL.lower()の比較? –

+0

はい、PythonのLの部分は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)) 

また、私は多分あなたはより多くのコードを作るために、デザインを再評価できることが示唆フレキシブル。理解とジェネレータの表現は良いスタートです。あなたは、Python 3を使用している場合は

2

、あなたはextended iterable unpacking使用することができます。その内のメソッドを使用する方法が

if 'Python' in (*languages, *animals, *names):

関連する問題