連鎖比較を簡素化する


254

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

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.