while文でリストを一つずつ処理
Pythonでリストの要素を順番に処理する方法として、多くの方はまずfor
文を連想するでしょう。しかし、条件を細かく指定したり、特定のタイミングでループを終了したいときなどにはwhile
文が役立ちます。本記事では、while文を使ってリストの全要素を一つずつ処理する方法を、初心者の方にもわかりやすく解説します。
while文とは?
Pythonのwhile
文は、指定した条件がTrue
の間、ブロック内の処理を繰り返す制御構文です。基本的な構文は以下のとおりです:
while 条件式:
# 繰り返したい処理
この条件式
がFalse
になるとループが終了します。もし条件式がずっとTrue
のままだと、無限ループに陥ってしまうため、通常はループの中で変数を更新したり、終了条件に関わる処理を行ったりして、最終的に条件式がFalse
になるように設計します。
while文でリストを処理するメリットと特徴
リストの要素を順番に取り出すだけならfor
文がシンプルで分かりやすい場合も多いですが、while
文を使うメリットも存在します:
- リストの長さや特定の条件を柔軟に扱える
- 要素を動的に削除・追加しながら処理しやすい
- 条件に応じて途中でループを止めやすい
たとえば、ある要素が見つかるまでリストを走査し続け、見つかったらループを抜けるといった処理を簡潔に書ける場合があります。for
文でもbreak
は使えますが、while
文のほうがロジックを組み立てやすいケースもあるのです。
while文でリストを順番に処理する基本例
まずはシンプルに「リストの要素をすべて取り出して表示する」例を見てみましょう。
ここでは、while
文を使って、リストのインデックスを管理しながら要素を順番に取得します。
fruits = ["apple", "banana", "cherry", "durian"]
index = 0 # リストのインデックスを管理
while index < len(fruits):
fruit = fruits[index]
print(f"フルーツ: {fruit}")
index += 1 # 必ずインデックスを増やす
上のコードでは、index
がリストの要素数(= len(fruits)
)に達するまでループが繰り返され、順にフルーツ名が出力されます。もしindex += 1
を忘れてしまうと、index
の値が更新されずに無限ループになるので注意しましょう。
条件付きでリストを処理しながら要素を削除・追加する例
while
文では、リストの内容を動的に変更しながら処理を続けるケースにも対応しやすいです。たとえば、リストの先頭要素を取り出し、その値に応じて別のリストに移動していくような処理を考えてみます。
numbers = [1, 3, 5, 2, 4, 6, 8]
even_numbers = []
# numbersから偶数を取り出してeven_numbersに移す
while numbers: # numbersが空リスト([])になるまで繰り返す
num = numbers.pop(0) # リストの先頭を取り出し
if num % 2 == 0:
even_numbers.append(num)
print("処理後のnumbers:", numbers) # すべて奇数が取り除かれた結果、もしくは空になっているはず
print("取り出した偶数のリスト:", even_numbers)
この例では、while numbers
という条件式でnumbers
リストが空になるかどうかをチェックしています。リストが空になればFalse
となるため、そこでループが終了します。pop(0)
でリストの先頭要素を取り出すと、リストのサイズが毎回1つずつ減っていくため、最終的には空になって止まるのです。
取り出した要素が偶数かどうかをif
文で判定し、even_numbers
リストに追加しています。最終的にnumbers
リストが空になり、偶数がeven_numbers
に集められます。こうした動的な操作では、for
文よりもwhile
文のほうがわかりやすく書ける場合があります。
無限ループを避けるためのポイント
while
文は条件式がTrue
の間は永久に繰り返す性質があるため、無限ループに注意が必要です。以下の点に気をつけましょう:
- ループ内で
index
などの管理変数を更新する - リスト操作によってループが正常に終了するか確認する
break
文を使って、ある条件下で明示的にループを抜ける設計をする
特にリストの要素数を変化させながらwhile
文を回す場合は、どのタイミングでリストが空になるのか、あるいはどのタイミングでインデックスがリストの範囲を超えるのかを明確にしないと、思わぬバグにつながりかねません。
for文との使い分け
Python初心者の方の中には、「リストを処理するときにwhile
文を使うべきかfor
文を使うべきか迷う」という人もいるでしょう。一般的には、リストの全要素を単に順番に処理するだけならfor
文がわかりやすく、かつ安全です。for
文であればインデックス管理のミスによる無限ループのリスクが低いからです。
一方、while
文は「途中で条件に応じて終了したい」「リストから要素を取り除きながら、処理を続けたい」といったケースにおいて、柔軟な制御が可能です。明示的にインデックスやリストの状態をチェックしながら進めたい場合にはwhile
文の方がわかりやすいコードになることも多々あります。
実践例: ユーザーからの入力をリストに追加し続ける
最後に、while
文の柔軟性を活かした簡単な例を挙げます。ユーザーから文字列を入力してもらい、それをリストに追加し続ける処理を考えます。空文字が入力されたら処理を終了するといった仕組みです。
user_inputs = []
while True:
data = input("何か文字列を入力してください(空で終了): ")
if data == "":
print("入力が空だったため終了します。")
break
user_inputs.append(data)
print("入力されたリスト:", user_inputs)
このように、ユーザーが空文字を入力するまでwhile True
でループを回し、break
で抜ける形をよく見かけます。もしdata == ""
のチェックを忘れてしまうと、ユーザーが何をしてもループが終わらなくなってしまうので、しっかりと抜けるための条件を用意するのが重要です。
まとめ
本記事では、Pythonにおけるwhile
文を使ってリストを一つずつ処理する方法をご紹介しました。while
文は、for
文とは異なり「条件を満たしている限り処理を繰り返す」という性質があります。そのため、リストの要素数やインデックスを動的に扱いつつ、特定の条件を満たしたらループを終了するといったフレキシブルな処理が可能です。
ただし、while
文を使う際には、無限ループのリスクやインデックスの範囲外アクセスに注意しなければなりません。index += 1
のように必ずインデックスを更新する処理や、条件式がFalse
になるタイミングをはっきりさせることが重要です。単純にリストの要素を順番に処理するだけであればfor
文でも十分ですが、状況に応じてwhile
文の利点を活かすことで、より柔軟なロジックを実装できるようになります。
初心者の方は、まずfor
文でリストを処理する基本を身につけてから、while
文による制御の仕組みを徐々に理解すると良いでしょう。慣れてくると、必要に応じてwhile
文とfor
文を使い分けられるようになり、Pythonでのプログラミングがいっそう便利になります。