いわゆる “イテラブル” なオブジェクトは for 文で回せますが、リストのように値だけのもの、辞書のようにキーと値を持つものなど、対象とするオブジェクトによって方法に少し違いがあります。
その違いを、リスト、辞書、Series、DataFrame、ジェネレータ、イテレータについて見ていきます。
- 目次 -
スポンサーリンク
リスト
python のリスト、numpy のリストのまわし方は同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
data = [1, 2, 3] for v in data: print (v) #--- # 1 # 2 # 3 #--- import numpy as np data = np.array([1, 2, 3,]) for v in data: print (v) #--- # 1 # 2 # 3 #--- |
enumerate
インデックスも必要な場合は enumerate 関数を使います。
1 2 3 4 5 6 7 8 9 |
data = [1, 2, 3] for i, v in enumerate(data): print (i, v) #-------- # (0, 1) # (1, 2) # (2, 3) #-------- |
辞書
辞書の場合、キーと値があるので
- キーと値 が必要なら → items メソッド
- キーだけ が必要なら → keys メソッド
- 値だけ が必要なら → values メソッド
を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
data = {'a': 1, 'b': 2, 'c': 3} #======== items ======== # キーと値 for k, v in data.items(): print (k, v) #---------- # ('a', 1) # ('c', 3) # ('b', 2) #---------- #======== keys ========= # キーだけ for k in data.keys(): print (k) #--- # a # c # b #--- #======== values ======= # 値だけ for v in data.values(): print (v) #--- # 1 # 3 # 2 #--- |
Series
インデックスと値 を取り出す場合は iteritems メソッドを使います。
インデックス だけなら index 属性で取得できます。
Series のオブジェクトを直接 for でまわすと 値 が取り出せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
from pandas import Series data = Series([1, 2, 3], index=['a', 'b', 'c']) #-------- # a 1 # b 2 # c 3 #-------- #====== iteritems ====== # インデックスと値 for i, v in data.iteritems(): print (i, v) #---------- # ('a', 1) # ('b', 2) # ('c', 3) #---------- #======== index ======== # インデックスだけ for i in data.index: print (i) #--- # a # b # c #--- #======= 値 だけ ======= for v in data: print (v) #--- # 1 # 2 # 3 #--- |
DataFrame
DataFrame は 2次元データなので、for文を縦方向にループさせる場合と横方向にループさせる場合で方法が異なります。縦方向 は iterrows メソッド、横方向 は iteritems メソッドを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from pandas import DataFrame data = DataFrame({'X': [1, 2, 3], 'Y': [100, 200, 300]}, index=['a', 'b', 'c']) #------------ # X Y # a 1 100 # b 2 200 # c 3 300 #------------ #====== iterrows ======= # 縦方向にループ for i, v in data.iterrows(): print (i, v['X'], v['Y']) # v は Series #--------------- # ('a', 1, 100) # ('b', 2, 200) # ('c', 3, 300) #--------------- #====== iteritems ====== # 横方向にループ for i, v in data.iteritems(): print (i, v['a'], v['b'], v['c']) # v は Series #----------------------- # ('X', 1, 2, 3) # ('Y', 100, 200, 300) #----------------------- |
ジェネレータ
yield でデータを返すメソッドも for文で扱えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def func(): yield 1 yield 2 yield 3 for v in func(): print (v) #--- # 1 # 2 # 3 #--- |
イテレータ
__iter__ と next を定義しておけば、クラス内部を for文で走査できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class ccc(object): def __init__(self): self.data = [1, 2, 3] self.i = 0 def __iter__(self): return self def next(self): if self.i >= len(self.data): raise StopIteration() self.i += 1 return self.data[self.i-1] for v in ccc(): print (v) #--- # 1 # 2 # 3 #--- |