Pythonでforループの最終反復を判定するテクニック

はじめに

Pythonでリストやイテラブルを処理する際、最後の要素だけ特別な処理をしたい場面はよくあります。本記事では、forループの最終反復を確実に捉えるための複数の方法をコード例とともに解説します。各手法のメリット・デメリットも考察します。

1. インデックスと enumerate() を使う方法

1.1 基本的な書き方

組み込み関数 enumerate() でインデックスを取得し、len() - 1 と比較します。

items = [10, 20, 30, 40, 50]

for idx, val in enumerate(items):
    if idx == len(items) - 1:
        print(f"{val} → 最終要素")
    else:
        print(val)

1.2 実行例

items = ['A', 'B', 'C', 'D']

for idx, val in enumerate(items):
    if idx == len(items) - 1:
        print(f"{val} → 最終要素")
    else:
        print(val)

出力結果:

A
B
C
D → 最終要素

2. スライスを使って最終要素と比較する方法

2.1 基本パターン

ループ変数の中身が data[-1] と一致するかどうかで判断します。ただし、重複値がある場合は注意が必要です。

numbers = [1, 2, 3, 4, 5]

for n in numbers:
    if n == numbers[-1]:
        print(f"{n} → ラスト")
    else:
        print(n)

2.2 使用例と注意点

items = ['X', 'Y', 'Z', 'X']   # 先頭と末尾が同じ値

for v in items:
    if v == items[-1]:
        print(f"{v} → 最終と判定された")
    else:
        print(v)

出力結果:

X → 最終と判定された
Y
Z
X → 最終と判定された

この方法は、末尾と同じ値が途中に存在すると正しく動作しないことを示しています。

3. イテレータ(itertools.tee())を使う方法

3.1 実装の流れ

itertools.tee() で2つのイテレータを作り、一方を1つ進めてから zip() で同時に回します。次の要素が None のときに現在の要素が最終だとわかります。

import itertools

data = [100, 200, 300, 400]
it_a, it_b = itertools.tee(data)
next(it_b, None)

for cur, nxt in zip(it_a, it_b):
    if nxt is None:
        print(f"{cur} → 終端")
    else:
        print(cur)

3.2 完全なコード例

import itertools

fruits = ['apple', 'banana', 'cherry', 'date']
it1, it2 = itertools.tee(fruits)
next(it2, None)

for cur, nxt in zip(it1, it2):
    if nxt is None:
        print(f"{cur} ← 最後の果物")
    else:
        print(cur)

出力結果:

apple
banana
cherry
date ← 最後の果物

4. ジェネレータで最終かどうかをタグ付けする方法

4.1 カスタムジェネレータの定義

独自のジェネレータ関数を作り、各要素とともに「最終かどうか」のブール値を yield します。

def tag_last(iterable):
    it = iter(iterable)
    prev = next(it)
    for item in it:
        yield prev, False
        prev = item
    yield prev, True

values = [5, 10, 15, 20]

for v, is_last in tag_last(values):
    if is_last:
        print(f"{v} → ラスト")
    else:
        print(v)

4.2 別データでのテスト

def tag_last(seq):
    it = iter(seq)
    first = next(it)
    for x in it:
        yield first, False
        first = x
    yield first, True

chars = ['P', 'y', 't', 'h', 'o', 'n']

for ch, end_flag in tag_last(chars):
    if end_flag:
        print(f"{ch} ← 最終文字")
    else:
        print(ch)

出力結果:

P
y
t
h
o
n ← 最終文字

おわりに

以上、Python で for ループの最終反復を判定する代表的な4つの手法を紹介しました。状況に応じて、読みやすさ・正確さ・パフォーマンスを考慮して適切な方法を選んでください。

タグ: Python forループ イテレータ enumerate itertools.tee

5月28日 13:37 投稿