Python の enumerate 関数で 1 から開始する方法 ⇒ start=1 を指定する

Python の enumerateイニュームレート 関数で、番号を 1 から始める方法です。

引数ひきすうの start に 1 を指定するとできました。

コード例です。

"""enumerate関数で 1 から開始するPythonコード例"""

datas = ['春はる', '夏なつ', '秋あき', '冬ふゆ']

for (n, d) in enumerate(datas, start=1):
    print(f'{n}: {d}')

print('\n引数名の start は省略してもOK')
for (n, d) in enumerate(datas, 1):
    print(f'{n}: {d}')

実行結果です。

1: 春はる
2: 夏なつ
3: 秋あき
4: 冬ふゆ

引数名の start は省略してもOK
1: 春はる
2: 夏なつ
3: 秋あき
4: 冬ふゆ

意図いとした通り、番号を 1 から始めることができました。

以上です。

スポンサーリンク

番号を 1 から始めるときは『start=1』を指定する

番号を 1 から始めるときは、enumerate(list, start=1) のように、スタート start=1 を指定するとできました。

Python 公式マニュアル
組み込み関数 enumerate(iterable, start=0)

引数名を省略して、たんに 1 と書いても OK でした。

enumerate(list, 1) のように書いても、番号を 1 から始めることができました。

番号を -1 から始めるときは『start=-1』を指定する

リストの内容によっては、マイナスの 1 から始めたいこともあります。

スタートの引数に start=-1 を指定するとできました。

コード例

enumerate() にマイナス 1 を指定して、for ぶんにかけます。

ところで、番号のマイナス符号ふごうの分だけ、表示がズレました。

なので、番号表示の桁数けたすうを指定するコードも書きました(参考)。

"""enumerate関数で -1 から開始するPythonコード例"""

datas = ['春はる', '夏なつ', '秋あき', '冬ふゆ']

for (n, d) in enumerate(datas, start=-1):
    print(f'{n}: {d}')

print('\n引数名の start は省略してもOK')
for (n, d) in enumerate(datas, -1):
    print(f'{n}: {d}')

print('\n数値を2桁分の幅で表示する方法 (参考)')
for (n, d) in enumerate(datas, start=-1):
    print(f'{n:2}: {d} f-string')
    print('{n:2}: {d} str.format'.format(n=n, d=d))
    print('%(n)2d: %(d)s %% dict' % dict(n=n, d=d))
    print('%2d: %s %%' % (n, d))

print('\n空白を 0 で埋めて表示する方法 (参考)')
for (n, d) in enumerate(datas, start=-1):
    print(f'{n:02}: {d} f-string')
    print('{n:02}: {d} str.format'.format(n=n, d=d))
    print('%(n)02d: %(d)s %% dict' % dict(n=n, d=d))
    print('%02d: %s %%' % (n, d))

実行結果

実行結果です。

意図した通り、マイナス 1 から始まっています。

-1: 春はる
0: 夏なつ
1: 秋あき
2: 冬ふゆ

引数名の start は省略してもOK
-1: 春はる
0: 夏なつ
1: 秋あき
2: 冬ふゆ

数値を2桁分の幅で表示する方法 (参考)
-1: 春はる f-string
-1: 春はる str.format
-1: 春はる % dict
-1: 春はる %
 0: 夏なつ f-string
 0: 夏なつ str.format
 0: 夏なつ % dict
 0: 夏なつ %
 1: 秋あき f-string
 1: 秋あき str.format
 1: 秋あき % dict
 1: 秋あき %
 2: 冬ふゆ f-string
 2: 冬ふゆ str.format
 2: 冬ふゆ % dict
 2: 冬ふゆ %

空白を 0 で埋めて表示する方法 (参考)
-1: 春はる f-string
-1: 春はる str.format
-1: 春はる % dict
-1: 春はる %
00: 夏なつ f-string
00: 夏なつ str.format
00: 夏なつ % dict
00: 夏なつ %
01: 秋あき f-string
01: 秋あき str.format
01: 秋あき % dict
01: 秋あき %
02: 冬ふゆ f-string
02: 冬ふゆ str.format
02: 冬ふゆ % dict
02: 冬ふゆ %

数値を表示するときの『桁数けたすう』を指定する書き方は、4種類を試しました。

おすすめは、f-stringエフ ストリング で指定する方法です。Python 3.6 以降で使用可能でした。

コードが短くて、読みやすくて、開発効率が高かったです。

Python 公式マニュアル
エフストリング f''(フォーマット済み文字列リテラル)

自分の場合ですが、新規に書くコードでは、f-string をメインに使っています。

従来の方法も、もちろん使えました。

Python 公式マニュアル
フォーマットメソッド str.format(*args, **kwargs)

Python 公式マニュアル
パーセント % 書式(辞書を使った方法)
パーセント % 書式(辞書無しの方法)
パーセント %(printf 形式の文字列書式化)

辞書を enumerate() に渡す時に開始番号『1』を指定する

連番の開始番号『1』を指定して、辞書に連番をつけながら取り出すコード例です。

開始番号は、enumerate() の引数 start=1 で設定します。

コード例

3種類書きました。

『キー (key) と値 (value)』、『キーのみ』、『値のみ』の3種類です。

"""辞書にenumerate関数を使うPythonコード例"""

datas = {
    '春': 'はる',
    '夏': 'なつ',
    '秋': 'あき',
    '冬': 'ふゆ'}

print('『1』始まりの連番をつけながら取得する')
for (n, (k, v)) in enumerate(datas.items(), start=1):
    print(f'{n}: key:{k} value:{v}')

print('\n辞書のキー(key)だけを取得する')
for (n, k) in enumerate(datas.keys(), start=1):
    print(f'{n}: key:{k}')

print('\n辞書の値(value)だけを取得する')
for (n, v) in enumerate(datas.values(), start=1):
    print(f'{n}: value:{v}')

実行結果

実行結果です。Python 3.7.5 で実行しました。

辞書から取り出したアイテム、キー、値についても、1始まりの番号をつけることができました。

『1』始まりの連番をつけながら取得する
1: key:春 value:はる
2: key:夏 value:なつ
3: key:秋 value:あき
4: key:冬 value:ふゆ

辞書のキー(key)だけを取得する
1: key:春
2: key:夏
3: key:秋
4: key:冬

辞書の値(value)だけを取得する
1: value:はる
2: value:なつ
3: value:あき
4: value:ふゆ

※ 辞書の中身の順番は、Python 3.7 以降で保存されるとのことでした。

バージョン 3.7 で変更: 辞書の順序が挿入順序であることが保証されるようになりました。

組み込み型 マッピング型 — dict

『start=1』と『1』はどちらが高速なのか?

イニュームレート enumerate() の開始番号を指定する方法の比較です。

タイムイット timeit() で時間を計りました。

『1』の方が高速だった

結論ですが、引数名ひきすうめいなしで指定した方が、少しだけ速かったです。

ですが、速いといっても、100万回の実行で1秒に満たない差でした。

なので、自分は好みで選んで使っています。

時間計測のコード

"""引数名の start= を『付けた場合』と『付けない場合』の比較"""

import timeit

datas = ['春はる', '夏なつ', '秋あき', '冬ふゆ']

def enumerate_a():
    """名前あり"""
    for (n, d) in enumerate(datas, start=1):
        pass
    return

def enumerate_b():
    """名前無し"""
    for (n, d) in enumerate(datas, 1):
        pass
    return

# 100万回の実行に要する合計時間を計る
N = 1000000
G = globals()

print(f'{N} 回の実行に要した合計時間')
ta = timeit.timeit('enumerate_a()', number=N, globals=G)
print(f'{ta:.5f} 秒 ← 引数名あり enumerate(list, start=1)')

tb = timeit.timeit('enumerate_b()', number=N, globals=G)
print(f'{tb:.5f} 秒 ← 無し enumerate(list, 1)')

Python 公式マニュアルの場所です。

単純文 (simple statement)
pass 文

組み込み関数
グローバールス globals()

timeit — 小さなコード断片の実行時間計測
Python インターフェイス
timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)

実行結果

時間を計った結果です。

微々たる差ではありましたが、引数名を付けないほうが速かったです(短時間で完了していました)。

1000000 回の実行に要した合計時間
0.49180 秒 ← 引数名あり enumerate(list, start=1)
0.41559 秒 ← 無し enumerate(list, 1)

この程度の差であれば、どちらの方法でも良いと思います。

タイトルとURLをコピーしました