Featured image of post イテレータでループさせつつインデックスも取得する - Effective Python 項目7

イテレータでループさせつつインデックスも取得する - Effective Python 項目7

これはなに Link to this heading

Effective Python 第2版 、項目7「rangeではなくenumerateを使う」のまとめ。

ポイント Link to this heading

  1. enumerateを使えば、イテレータでループしつつ、要素のインデックスも取り出せる
  2. rangeでインデックスをループさせるより、enumerateを使ったほうが簡潔
  3. enumerateの第2引数で、インデックスの開始番号を指定できる

rangeとは Link to this heading

rangeはPythonの組み込み関数のひとつ。ループ処理に便利。

for i in range(10):
    print(i)

リストをループさせる Link to this heading

Pythonのlistは配列。これをループさせるときは、シーケンスを直接ループできる。

languages = ["python", "golang", "VHDL", "C++"]
for lang in languages:
    print(lang)

リストをループさせつつ、インデックスも取り出すことを考える Link to this heading

リストをループさせつつ要素のインデックスを得たい場合を考える。 rangeを使うと下記のように書ける。

languages = ["python", "golang", "VHDL", "C++"]
for i in range(len(languages)):
    lang = languages[i]
    print(f"{i + 1} : {lang}")

ただし、上記の書き方はステップが多く読みにくい。 Pythonには、こういう時に便利な組み込み関数enumerateがある。

enumerateとは Link to this heading

enumerateはPythonの組み込み関数のひとつ。遅延評価ジェネレータでイテレータをラップし、ループのインデックスとイテレータの次の値の対をyieldする。

公式ドキュメント によると、下記の記述と等価らしい。

def enumerate(iterable, start=0):
    n = start
    for elem in iterable:
        yield n, elem
        n += 1

つまり、enumerateは、「ループのインデックスとイテレータの次の値の対」を呼び出すたびに生成(遅延評価)するジェネレータを生成する。 呼び出すたびに生成するため、メモリを圧迫せずに処理できる。

enumerateはジェネレータを生成するため、nextを用いて次の値を取得できる。

languages = ["python", "golang", "VHDL", "C++"]
it = enumerate(languages)

print(next(it))  # (0, 'python')
print(next(it))  # (1, 'golang')

rangeではなくenumerateを使う Link to this heading

リストをループさせつつ要素のインデックスを得たい場合、enumerateを使うと下記のように書ける。

languages = ["python", "golang", "VHDL", "C++"]
for i, lang in enumerate(languages):
    print(f"{i + 1} : {lang}")

rangeを使った場合と比較すると、enumerateを使ったほうが簡潔に書ける。

languages = ["python", "golang", "VHDL", "C++"]

# enumerateを使う
for i, lang in enumerate(languages):
    print(f"{i + 1} : {lang}")

# rangeを使う
for i in range(len(languages)):
    lang = languages[i]
    print(f"{i + 1} : {lang}")

enumerateのカウント開始の数を変更する Link to this heading

enumerateの第2引数にカウントを開始する数を指定できる。これを利用すると、先のコードはより簡潔に書ける。

languages = ["python", "golang", "VHDL", "C++"]
for i, lang in enumerate(languages, 1):
    print(f"{i} : {lang}")

参考文献・URL Link to this heading

Effective Python 第2版's image

Effective Python 第2版

www.oreilly.co.jp
組み込み関数's image

組み込み関数

Python インタプリタには数多くの関数と型が組み込まれており、いつでも利用できます。それらをここにアルファベット順に挙げます。,,,, 組み込み関数,,, A, abs(), aiter(), all(), anext(), any(), ascii(),, B, bin(), bool(), breakpoint(), bytearray(), bytes(),, C, callabl...

docs.python.org
Licensed under CC BY-NC-SA 4.0
最終更新 10月 07, 2023
Hugo で構築されています。
テーマ StackJimmy によって設計されています。