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 で変更: 辞書の順序が挿入順序であることが保証されるようになりました。
『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)
この程度の差であれば、どちらの方法でも良いと思います。