YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

forループでのイディオム

動機

Pythonはfor-loopと言いつつ実際は他言語で言うところのfor-each的な使い方をするのでしばらく使っていないとダメコードを書いてしまう。そのためのメモ。

表現

range()を使って

普通のループとかはこんな感じで。

for i in range(1,10):
    print i
zip()を使って

for-eachの発想でPythonでは配列リストを使うことが推奨。当然リストだけでなく、タプルも使う。zip()は同要素数のリストをタプルのリストにするのでこういうことができる。

for i, j in zip(range(1,10), range(101,110)):
    print i, j
enumerate()を使って

上記の場合は要素数さえ合っていればいいので、2つのリストの各要素の型は特に気にしないけど、単純にインデックスがほしい場合はenamerate()を使うと便利。

week = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
for i, x in enumerate(week):
    print i, x
辞書を使って

辞書は普通な発想で。

week = {'Mon':0, 'Tue':1, 'Wed':2, 'Thu':3, 'Fri':4, 'Sat':5, 'Sun':6}
for k, v in week.iteritems():
    print k, v

ただし辞書なので表示は順不同です。あしからず。

まとめ

イテレータを持ってる物はぐるぐる回せます。

追記 (2008.11.12)

辞書型の場合にiteritems()メソッドを用いてあげないと

list(iter(week)) == list(week.keys())

となりエラーになることをご指摘いただきました。id:morchinさんありがとうございました。