ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

python: if elseでfor文内の処理を判断する一例

備忘録です。

for文内に複数の式があって、その式を上から実行していく途中で条件を満たさなくなったためfor文から抜けて式を実行しないようにする(ちょっと説明がややこしい)一例です。

if elseを一文の形で式の後に書いて条件分岐させる

今回の条件としては下記のような集合があったとして

 {1, 2, 7, 8, 9}

 

この集合から二回、最小と最大の数値を削除するという要件があり、これをfor文で回そうとしました。つまり、

  • 1回目:{1, 2, 7, 8, 9}から最小{1}、最大{9}を削除→{2, 7, 8}
  • 2回目:{2, 7, 8}から最小{2}、最大{8}を削除→{7}
  • 残りをリターン:{7}

という作業をする感じです。

data = {1, 2, 7, 8, 9}

# 繰り返しで最小を削除、最大を削除という処理を2度行う
for i in range(2):
    data.remove(min(data))
    data.remove(max(data)) 

# {7}

 

しかし、上記だともし、与えられた集合が{8, 9, 7}で、

同様に2度最小と最大を削除しようとすると

  • 1回目:{8, 9, 7}から最小{7}、最大{9}を削除→{8}
  • 2回目:{8}から最小{8}を削除→この時点で空 {} になる。

そのため、2回目の最大値の削除ができなくなりエラーとなる。

data = {8, 9, 7}

# 繰り返しで最小を削除、最大を削除という処理を2度行う
for i in range(2):
    data.remove(min(data))
    data.remove(max(data)) 

# 上記の場合、2回目の最大値を求める式の時点で{}になっておりエラーが出る

なので、{}になった時点でfor文を抜ける、もしくは処理をしないようにする必要がありました。

 

最終的に、最小、最大を削除する際にif elseを付け加えてそれぞれ、処理をするのかしないのか判断させました。

data = {8, 9, 7}

# 繰り返しで最小を削除、最大を削除という処理を2度行う
for i in range(2):
    data.remove(min(data)) if len(data) > 0 else data
    data.remove(max(data)) if len(data) > 0 else data

# 各行を処理する前にdataが{}じゃないかチェックする。{}ならdataを返す

もっといい方法ありそうだけど。ひとまず問題なく処理可能です。