連鎖比較を簡素化する


254

整数値がありx、それがa startとend値の間にあるかどうかを確認する必要があるため、次のステートメントを記述します。

if x >= start and x <= end:
    # do stuff

このステートメントには下線が引かれ、ツールチップから私は

連鎖比較を簡素化する

私の知る限りでは、その比較は彼らが来るのと同じくらい簡単です。ここで何を逃したのですか?


1
ツールチップから提案が表示された場合は、その領域にカーソルを合わせると、小さな電球が表示されます。それをクリックすると、提案されている変更が自動的に挿入されます。これにより、実行する必要があると思われることがわかります(気に入らない場合は、元に戻すことができます)。
— Edward Ned Harvey

回答:


432

Python では、比較演算を「チェーン」することができます。つまり、それらは「かつ」一緒に比較されます。あなたの場合、それは次のようになります:

if start <= x <= end:

リファレンス:https : //docs.python.org/3/reference/expressions.html#comparisons


2
ありがとう、Pythonでそれができるとは知りませんでした。これで本当に頭を悩ませました。
— Brynn McCullagh 2014年

18
男これは物事がどうあるべきかです。しかし、他の言語から来ると、理想を忘れて、物事は本来あるべき姿であるとは考えていません。しかし、Pythonがすばらしいのはこのためです。まさにそのようなことのためです:)
— Hakaishin

チェーンスタイルを推奨する「公式」ソースを知っていますか。より「慣用的」なPythonはどれですか?
— Ray

わからないけど、Pythonがもっと多くのガードレールを投げたいと思うこともある。x、y、zがPandasシリーズの場合、x == y == zはValueErrorで失敗します
— BallpointBen

@BallpointBen:パンダで期待したとおりに機能しないものもたくさんありますx == y and y == z。
— John Zwinck

12

次のように書き換えることができます。

start <= x <= end:

または:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....

5
範囲を大きくすると、開始と終了が大きくなり、不要なリストが作成されるため、適切な選択ではありません。
— Burhan Khalid

1
@BurhanKhalid確かに、OPについて言及する価値はあると思います。
— Maroun 2014年

7
python3では、範囲ハンドルは ""を適切に含むため、リストは生成されません。
— JoshNahum

2
@MarounMaroun python 3以降、range関数は以前のxrangeのように動作し、言及する価値もあります
— dvdvck

5
の使用の詳細についてはif x in range(...)、「Python 3で「1000000000000000 in range(1000000000000001)」がなぜ高速なのですか?」を参照してください。
— ケビンJ.チェイス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.