home changes contents help options

100:配列のインデックスと配列のペアを取得する

enumerate - 列挙オブジェクトを作る

リストを for 文で処理している際、今何番目か確認するためインデックスにアクセスしたくなることがたまにあります。 避けられるならインデックスに頼らないコードを書くよう心がけたくはありますが。 さて、「今から書くコードではインデックスの値が必要なんだ」と判断したとします。そんなとき i = 0, i += 1 のようなコードを書いてはいないでしょうか。 本件にうってつけの組み込み関数があるんです。

enumerate(iterable) です。 リストを渡すと列挙オブジェクトなるものを返します。 列挙オブジェクトはジェネレータの一種で (カウント値, 値) のタプルを出力します。

使い方はリストを enumerate で包み、 for 文開始時にアンパック代入するだけです。:

   >>> L = ["a", "b", "c", "d", "e"]
   >>> for index, value in enumerate(L):
   ...     print index, value
   ...
   0 a
   1 b
   2 c
   3 d
   4 e

リスト以外もカウントしてみる

enumerate は反復可能であるオブジェクトなら リスト以外でも受け付けます。:

   >>> s = "abc"
   >>> for index, value in enumerate(s):
   ...     print index, value
   ...
   0 a
   1 b
   2 c
   >>> d = dict(a="aa", b="bb", c="cc")
   >>> d
   {'a': 'aa', 'c': 'cc', 'b': 'bb'}
   >>> for index, value in enumerate(d):
   ...     print index, value
   ...
   0 a
   1 c
   2 b

ファイルオブジェクトに用いると行数をカウントさせることができます。:

   >>> import codecs
   >>> f = codecs.open("recipe100_配列のインデックスと配列のペアを取得する.txt", "r", "cp932")
   >>> for index, line in enumerate(f):
   ...     print "%3d: %s" % (index, line),
   ...
     0: 100:配列のインデックスと配列のペアを取得する
     1:
     2:  "enumerate":http://www.python.jp/doc/release/lib/built-in-funcs.html - 列挙オブジェクトを作る
     3:
     4:   リストを for 文で処理している際、今何番目か確認するためインデックスにアクセスしたくなることがたまにあります。
   (…後略)