繰り返し、イテレータ#
教科書 p.101(Lesson 5)リストの要素を順に取り出す場合、for文を用います。
以下の文で、リストの各要素を順番に取り出し、変数に代入して処理を行います。
このように順に処理できるような仕組みをイテラブル(iterable; 反復可能)と呼びます。
ほとんどのコレクションはイテラブルであり、同じように for 文で処理できます。
for 変数 in リスト:
処理リストはイテラブルであるため、イテレータ(iterator; 反復子)を取り出し、繰り返しに用いることができます。
イテラブルはイテレータを取得するための仕組みであり、イテレータは、反復処理した結果ではなく、反復処理するための仕組みです。
イテレータは、iter 関数で取得します。
>>> items = [1, 2, 3, 4, 5]
>>> i = iter(items)
>>> 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 を返すように指定する。
>>> v # 値がない(None)であるため、何も出力されない。
>>> print(v)
None
>>> for i in iter(items):
... 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とは、リストやタプルの要素を取り出して別々の変数に代入することです。
代入や繰り返しの処理でよく使われます。
>>> items = [1, 2, 3]
>>> a, b, c = items # items の各要素を a, b, c に代入する。
>>> a, b, c
(1, 2, 3)
>>> a
1
>>> b
2
>>> c
3
>>> a, b = items # 左辺と右辺の数があっていなければエラーが発生する。
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(f"{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)です。
- 降順(大きい順)に並べ替える場合は、
