質問:
例えばこんなリストがあったとき、このリストのインデックスにアクセスするにはどうしたらいいの?
|
これをforループで使う時、どうやってこのループインデックス(この場合1から5)にアクセスしたらいいの?
回答1:
インデックス変数とかの追加の状態変数を使用するのはあんまりPythonっぽく無いんだ(CとかPHPなどの言語だと普通だけど)。
より良い方法は組み込み関数を使うこと:enumerate()
]、Python2と3の両方で利用できるよ:
|
詳しく知りたければPEP 279を参照してみて。
回答2:
これをforループで使う時、どうやってこのループインデックス(この場合1から5)にアクセスしたらいいの?
enumerate
を使おう:
|
あとインデックスはゼロから始まるので、これで0〜4になることに注意。もし、あんたがカウントをしたいっていうのなら、こんな感じに説明するかな。
慣習的じゃないやり方
君が求めているのは、以下のPythonicなやり方だろ。これはほとんどの低レベル言語のプログラマーはこのアルゴリズムを使うと思う:
|
それかfor-eachループを持たない言語だと:
|
それか、ときどきより一般的に(慣習的じゃない)やり方:
|
列挙関数enumerate
を使う
Pythonのenumerate
関数は、インデックスのための計算処理を隠して、変数をカプセル化することで視覚的にごちゃごちゃしたのを減らす効果がある。こんな感じ:
|
このコードサンプルは、Pythonの慣習的な書き方と、そうじゃない書き方の違いを表すかなり典型的な例。慣用的なコードは洗練されている(でもそんな複雑じゃない)Python。
この慣用コードは、言語の設計者が意図した書き方、つまり、通常このコードはあんまり読みやすくないけど、より効率的。
カウントする
たとえインデックスが必要じゃなくても、iterationsのカウントが1から始まって、最後は自分のカウントする数になってほしい(時にはあった方がいい)時がある。
|
カウントする、っていうのは君が求めているもの以上のもの(インデックスだけじゃなくて)だとおもうけど、念のため。
結論
- Pythonのインデックスはゼロから始まる
- 反復処理中にこれらのインデックスを反復可能コードから取得するには、列挙関数を使用します
- 列挙型を慣用的な方法で(タプルのアンパックと一緒に)使用すると、読みやすくメンテナンス可能なコードが作れる。
だから、こうすべき:
|
回答3:
0
以外の1
から始めるのはかなり簡単:
|
注意
インデックスはここではタプル (idx、item)
だよ。ちょっとややこしいかもだけど。
回答4:
|