Pythonの繰り返し処理を使いこなす!!

takkun
どうも!たっくんです。
今更始めたマインクラフトが面白すぎてやばい!
朝から晩までやっていたいです( ・ิω・ิ)

プログラミングをしていると、繰り返し処理は結構登場するものだと思います。Pythonには、繰り返し処理で使える便利な関数がいろいろあるのでご紹介したいと思います!(`・ω・´)ゞ

enumerate

Pythonでの繰り返し処理は、主に、インデックス値を元に処理するか、中身を取り出しながら処理していると思います。

でも、たまに両方ほしいときないですか!?

インデックス値を元に処理 リストからデータを取り出すコードを書くのが面倒(ぉぃ
中身を取り出しながら処理 ループ回数やインデックスが欲しい時、自分で管理するのが面倒(ぉぃ

こんな時便利なのが「enumerate」です!「enumerate」を使うと、インデックスを取得しながら、リストの中身も同時に取り出すことができます!

以下のコードを見ていただくとわかりやすいかと思います(`・ω・´)ゞ

dataList = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for index, data in enumerate(dataList):
    print index, data

0 a
1 b
2 c
3 d
4 e
5 f
6 g

どうですか!?インデックス値と、中身をとりだしながら繰り返し処理が簡単にできました!コードも1行で済むので、自分でcounterを用意するよりスマートかと思います(*´ω`*)b

zip

プログラムでどのようにデータを持つかによりますが、複数のリストを同時に回したいときがあると思います!

こんな時、インデックス値を元に処理しながら複数のリストを参照すると思いますが、Pythonなら「zip」を使うと同時にループ処理させることができます!

dataListA = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
dataListB = ['1', '2', '3', '4', '5', '6', '7']
for dataA, dataB in zip(dataListA, dataListB):
    print dataA, dataB

a 1
b 2
c 3
d 4
e 5
f 6
g 7

上記では2つのリストでしたが、3つでも、4つでもOKです!(`・ω・´)ゞ

異なるサイズのリストを使用した場合は、一番少ないリストに合わせて処理されます。一番大きなリストに合わせて処理したい場合は、「izip_longest (Python 2系)」を使用します。

import itertools

dataListA = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
dataListB = ['1', '2', '3']
for dataA, dataB in itertools.izip_longest(dataListA, dataListB):
    print dataA, dataB

a 1
b 2
c 3
d None ←不足したものは「None」になります。
e None
f None
g None

map

リストの中身を、すべて関数に渡して処理したい時に便利なのが「map」です!要素を関数のに渡して、その実行結果から新しいlistを作成してくれます!

def split(path):
    return path.split('.')

dataList = ['pSphere.v[0]', 'pSphere.v[1]', 'pSphere.v[2]', 'pSphere.v[3]']
print map(split, dataList)

[['pSphere', 'v[0]'], ['pSphere', 'v[1]'], ['pSphere', 'v[2]'], ['pSphere', 'v[3]']]

for分を書かずして、繰り返し処理ができましたね(*´ω`*)

コレくらい単純なものでしたら「lambda」を使ってもっとコードを簡略化することができます。

dataList = ['pSphere.v[0]', 'pSphere.v[1]', 'pSphere.v[2]', 'pSphere.v[3]']
print map(lambda path:path.split('.'), dataList)

[['pSphere', 'v[0]'], ['pSphere', 'v[1]'], ['pSphere', 'v[2]'], ['pSphere', 'v[3]']]

filter

特定の条件に一致したものだけ処理した結果がほしい時に便利なのが「filter」です!要素を関数に渡して、Trueを返却した要素のみから新しいlistを作成してくれます!

dataList = ['pSphere.v[0]', 'pSphere.v[1]', 'pSphere.f[2]', 'pSphere.e[3]']
print filter(lambda path:len(path.split('.v'))>=2, dataList)

['pSphere.v[0]', 'pSphere.v[1]']

こちらも繰り返し処理をせず、「.v」で分割できたデータだけ抽出できました!