pythonのforループはいわゆるCのfor(for (int i; i < count; i++))なんかと違ってJavascriptのfor inループの様な書き方をする。
通常は多分問題になる事は無いがこのループだといわゆるindexを参照できない。要は今何番目の要素の処理をしているのかが分からない。
なので例えばPHPなんかで

for ($i = 0; $i < count($list); $i++) {
    if ($i % 2 == 0) echo '<li class="foo">'.$list[$i].'</li>';
    else echo '<li class="bar">'.$list[$i].'</li>';
}

みたいな事が出来ない。
これをやりたいときはこう書いてた。

for i in range(len(list)):
    if i % 2 == 0: print '<li class="foo">' + list[i] + '</li>'
    else: print '<li class="bar">' + list[i] + '</li>'

が、これだと事前にそのシーケンスの長さが分かっていないと駄目で例えば次のような書き方はエラーになってしまう。

f = open("sample.txt")
for i in range(len(f)):
    print i,f[i],

これは"sample.txt"を開いただけで実際何行あるかがこの時点では分からないからだ。
この場合はさらに

f = open("sample.txt")
rows = f.readlines()

としておいて

for i in range(len(rows)):

とすればうまくいく。
とはいえこのやり方だとファイルサイズが大きいほどメモリの消費も激しくなる。
で、最終的にはこう書けばうまくいくという事が分かった。

for i, v in enumerate(open("sample.txt")):
    print i,v,

これは、Rubyでいうところのeach_with_indexみたいなものか。
いつか役に立つかな?

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/2

コメントする