HOWTO · Python
Python で for ループを 1 から開始する方法
range() で 1 から数える方法、enumerate() で項目に 1 から番号を付ける方法、スライスで先頭の項目を飛ばす方法を Python で学びます。数値ループには range()、表示用の番号付けには enumerate()、項目の選択にはスライスを使います。Python のリストのインデックスは 0 から始まるままです。
このページの内容
Python のループで n まで 1 から数えるには、range(1, n + 1) を使います。range() は開始値を含み、終了値の手前で止まるため、終了値に 1 を足すと n まで含められます。これはループが生成する数値を変えるもので、リストのインデックスを変えるものではありません。表示用に項目へ番号を付けたり、先頭の項目を飛ばしたりする場合は、代わりに enumerate() やスライスを使います。この候補の記事の例は実行されており、その動作は提供された実行結果で確認されています。
range()で数値ループを1から始める
range() の開始値を 1 にし、終了値には最後に使いたい数より 1 大きい値を指定します。たとえば、次のループは 1 から 5 まで数えます。
n = 5
for number in range(1, n + 1):
print(number)
1
2
3
4
5
第1引数は開始値、第2引数は含まれない終了値です。そのため、range(1, 6) が生成するのは 1、2、3、4、5 です。最後の数を変えるには n を、開始値を変えるには 1 を置き換えます。3つ目の引数で刻み幅も指定できます。たとえば、range(1, n + 1, 2) は 2 ずつ増やします。range() を包む独自のヘルパー関数を作れば、この調整を再利用できますが、1つのループだけなら必要ありません。各値に 1 を加えるジェネレーター式でも数値を調整できますが、この数え方には range() を直接使うほうが分かりやすいでしょう。
enumerate()で項目に1から番号を付ける
項目を処理しながら、読者に各項目の位置を示すには enumerate(items, start=1) を使います。反復のたびに、番号と対応する項目を返します。
items = ["a", "b", "c"]
for number, item in enumerate(items, start=1):
print(number, item)
1 a
2 b
3 c
ここでは、number に表示用の 1、2、3 が入り、item にはリストの各値が入ります。start=1 は enumerate() が返す番号を変えますが、リスト本来のインデックスは変わらず、0から始まります。この方法は、名前に番号を付けて並べたり、行に人が読みやすい順番の番号を表示したりするときに便利です。Python のインデックスを使って項目にもアクセスする場合、表示番号はインデックスより 1 大きいことを覚えておき、コードではこの2つを区別してください。
先頭の項目を飛ばすにはスライスを使う
リストの先頭の値より後にある項目をすべて処理するなら、スライス items[1:] を反復します。
items = ["header", "first", "second"]
for item in items[1:]:
print(item)
first
second
スライスはインデックス 1 から始まるため、このループは "first" と "second" を処理し、元のリストは変更しません。スライスはそれらの値に新しい番号を付けるのではなく、ループに渡す値を選ぶだけです。リストのスライスは、選択した項目への参照を含む新しいリストです。先頭の値が見出しなどで処理対象外の場合にこの方法を使い、すべての項目を数えたり番号付けしたりする場合には使わないでください。
作業に合った方法を選ぶ
ループ自体に 1 から n までの数値を生成させるなら range(1, n + 1) を使います。すべての項目を処理しながら、それぞれに1からの番号を表示するなら enumerate(items, start=1) を使います。反復対象から先頭の項目を除くなら items[1:] を使います。これらはそれぞれ、生成する数値を変える、表示用に項目へ番号を付ける、コレクションの一部を選ぶという別々の目的に対応します。
刻み幅が 1 の場合は、最後の整数を含めるため、含まれない終了値をその整数より 1 大きく設定します。刻み幅が別の値の場合は、数列が目的の最終値にちょうど到達しなければならず、含まれない終了値は進行方向でその先になければなりません。1 を足すことは一般的な包含ルールではありません。enumerate() が 1 からの表示番号を返しても、Python のリストインデックスは 0 から始まるままです。必要な結果に合った最もシンプルな形式を選び、例を応用するときはループの数値、表示番号、リストインデックスを区別してください。