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でのプログラミングがいっそう便利になります。

