繰り返し,イテレータ #
教科書 p.101(Lesson 5)リストの要素を順に取り出す場合,for
文を用います.
以下の文で,リスト
の各要素を順番に取り出し,変数
に代入して処理
を行います.
このように順に処理できるような仕組みをイテラブル(iterable; 反復可能)と呼びます.
ほとんどのコレクションはイテラブルであり,同じように for
文で処理できます.
for 変数 in リスト:
処理
リストはイテラブルであるため,イテレータ(iterator; 反復子)を取り出し,繰り返しに用いることができます.
イテラブルはイテレータを取得するための仕組みであり,イテレータは,反復処理した結果ではなく,反復処理するための仕組みです.
イテレータは,iter
関数で取得します.
>>> list = [1, 2, 3, 4, 5]
>>> i = iter(list)
>>> next(i)
1
>>> next(i)
2
>>> next(i)
3
>>> next(i)
4
>>> next(i)
5
>>> next(i)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> v = next(i, None) # 次の要素が存在しない場合,None を返すように指定する.
>>> print(v)
None
>>> for i in iter(list):
... print(i)
1
2
3
4
5
上の実行例のように,iter
関数でイテレータを取得し,next
関数で次の要素を取り出します.
次の要素が存在しない場合,StopIteration
例外が発生します.
next
関数の第2引数には,次の要素が存在しない場合に返す値を指定できます.
next(i, None)
のように呼び出すと,次の要素が存在しない場合は,None
を返します.
イテレータは,要素を取り出すたびに次の要素を指すように進められるため,一度取り出した要素は再度取り出すことができません.
なお,明示的に next
関数を呼び出さなくても,for
文でも用いることが可能です.
リストの要素の組み合わせ(zip)と分解(unpack) #
教科書 p.122(Lesson 5)zip
関数を用いると,複数のリストを組み合わせたイテレータを取得できます.
>>> months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> month_names = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
>>> for m in zip(months, month_names): # months と month_names を組み合わせた要素を順番に取り出す
... print(m) # 組み合わせた要素を出力する.各要素はタプルになっている.
...
(1, 'Jan')
(2, 'Feb')
... # 途中省略
(11, 'Nov')
(12, 'Dec')
>>> for m in enumerate(month_names): # month_names の要素を順番に取り出し,インデックス(0始まり)を付ける.
... print(m)
...
(0, 'Jan')
(1, 'Feb')
... # 途中省略
(10, 'Nov')
(11, 'Dec')
unpack
とは,リストやタプルの要素を取り出して別々の変数に代入することです.
代入や繰り返しの処理でよく使われます.
>>> list = [1, 2, 3]
>>> a, b, c = list # list の各要素を a, b, c に代入する.
>>> a, b, c
(1, 2, 3)
>>> a
1
>>> b
2
>>> c
3
>>> a, b = list # 左辺と右辺の数があっていなければエラーが発生する.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
>>> for num, m in zip(months, month_names): # months の要素を num に,month_names の要素を m に代入する.
... print(m, "(", num, "月)") # 組み合わせた要素を出力する.各要素はタプルになっている.
...
Jan ( 1 月)
Feb ( 2 月)
... # 途中省略
Nov ( 11 月)
Dec ( 12 月)
enumerate
関数
#
enumerate
関数は,リストやタプルの要素を取り出し,インデックス(0始まり)を付けて返します.
インデックスのリストとの zip
と考えると良いでしょう.
>>> >>> month_names = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
>>> for (i, m) in enumerate(month_names): # month_names の要素を m に,インデックスを i に代入する.
... print(m, "(", i+1, "月)") # 組み合わせた要素を出力する(インデックスは0始まりであるため,+1 している).
...
Jan ( 1 月)
Feb ( 2 月)
... # 途中省略
Nov ( 11 月)
Dec ( 12 月)
その他の操作 #
- 逆順
リスト名[::-1]
はリストの要素を逆順にした新しいリストを取得します.元のリストは変更されません.reversed(リスト名)
はリストの順序を逆順にしたイテレータを取得します.元のリストは変更されません.リスト名.reverse()
は元のリストの要素を逆順にします.
- リストの集計
max(リスト名)
: リストの最大値を取得します.min(リスト名)
: リストの最小値を取得します.sum(リスト名)
: リストの合計値を取得します.sorted(リスト名)
: リストの要素を昇順(小さい順)に並べ替えた新しいリストを取得します.元のリストは変更されません.- 降順(大きい順)に並べ替える場合は,
sorted(リスト名, reverse=True)
とします. リスト名.sort()
: 元のリストの要素を昇順(小さい順)に並べ替えます.降順に並べ替える場合は,リスト名.sort(reverse=True)
です.
- 降順(大きい順)に並べ替える場合は,