2012-04-08 7 views
9

私は、多くの場合、xを繰り返し続けるために冗長思わ英語でPythonの場合、x == 1またはx == 5またはx == 10の場合、aを書くいくつかの他の方法は何ですか?

if x == 1 or x == 5 or x == 10 or x == 22 : 
    pass 

のようなコードを書いてしまうと、そのようなif文を書くためのより簡単またはより短い方法はありますか?

多分xの値がタプル(1, 5, 10, 22,)なのかどうかチェックしていますか?

+2

うんを、 '[1、50、10、22]でxは'書き込みが簡単であれば私が書いたように、 –

答えて

14

はい、あなたはタプルでもセットでも(このチェックが繰り返し行われた場合は)正しいです。

あなたは、多くの場合、このチェックを行うと、値の数が十分に大きい、

myset = set((1, 5, 10, 22)) 

[...] 

if x in myset: 
    pass 

mysetものはより便利、より多くの値あなたですのであればどちらかが、

if x in (1, 5, 10, 22): 
    pass 

を行いますか、確認したい4値は非常に少ないので、簡単に保つことができます。 400の値を使用する必要があります。

Marcinが指摘しているように、リスト内のルックアップに必要なハッシングは、リストやタプルを目的の値で直線的に検索するよりも高価です。

+7

Python 2.7/3. *では、set literal: '{1、5、10、22}'を使うこともできます。 Python 3.2以降では、 'in'チェック(変数に結果を保存しているのではないにしても)を行うのであれば、これは透過的に' frozenset'を使うように最適化します。 – Dougal

+2

+1を最初に提案するには、私はDougalに同意する必要があります可能であれば新しい構文を使用する必要があります。 –

+1

'set((1,5,10,22))'は '{1、5、10、22}'よりも多くのバージョンで動作し、実際にはもっと読みやすいIMHOではありません。 – martineau

6

あなたは、コレクションでinを使用することができます。これは新しいリストに行が実行されるたびに作成されます

if x in [1, 5, 10, 22]: 
    # etc... 

if x in {1, 5, 10, 22}: # New syntax for creating sets 
    # etc... 

注こと。効率が懸念される場合は、コレクションを1回作成して再利用してください。

+0

...またはセットを読んでください。 4つの値ではそれほど緊急ではなく、40,400,4000の場合はもっと緊急... – glglgl

+0

しかし、タプルはより一般的であり、セマンティックにはパフォーマンスの優遇を両方とも割り引いています(後者の場合はPythonのバージョンによって異なります) 。 – delnan

+0

@glglgl:ああ、セットが良いアイデアです。タプルはよく使われますが、私はそれが意味論的に最も適切な型ではないと思います。 –

2

あなたが良好な性能を必要とセット使用し、同じ比較を数回繰り返ししようとしている場合:

s = frozenset([1, 5, 10, 22]) # at the beginning 

if x in s: # in your code 
    pass 
+3

もちろん、小さなデータセットの場合、タプルが速くなる(ハッシュ処理が不要で、データ構造が単純化され、衝突リスクがない)、Python 3.2では、この最適化を無償で行うことができます(frozensetは1回だけ作成されます)if条件内でセットリテラルを使用します。また、すべてのパフォーマンスの問題と同じ条件と条件:(1)これを最適化する必要があるかどうかを測定します。 (2)もう一度#2! (3)本当ですか? (4)まあ、大丈夫です!あなたの選択肢を集めて、それをよくベンチマークしてください。 – delnan

+0

'frozenset'を作成するのは、通常の' list'と 'set'を作るよりも速いのですか? – George