Pythonのシーケンスには、Pythonにデフォルトで組み込まれている便利なシーケンス関数がいくつか用意されている。

enumerate関数

for文などのループ処理で、リストなどのシーケンスに順番に処理を加えるとき、その時のインデックス番号を使いたいケースは多々あるだろう。

例えば以下のサンプルコードを見てみよう。

cnt = 0
list = [1, 2, 3, 4, 5]

for val in list:
    print(val)
    print(cnt)
    cnt += 1

普通に書くと、cntのようなカウンタ変数を別途用意して、ループ内でカウンタ変数を更新していくといったコードを実装する事になる。

しかし、enumerate関数を使うことでもっとシンプルなコードを書くことができるのだ。

list1 = ['aaa', 'bbb', 'ccc']
list2 = {}

for i, val in enumerate(list1):
    list2[i] = val
    
list2 # {0: 'aaa', 1: 'bbb', 2: 'ccc'}

sorted関数

シーケンスをソートし、新たなリストを作成することができる。

list = [9, 2, 3, 1, 8, 5, 4]
new_list = sorted(list)

list # [9, 2, 3, 1, 8, 5, 4]
new_list # [1, 2, 3, 4, 5, 8, 9]

リストのsortメソッドと混同されがちだが、明確な違いがある。

sortメソッドは既存のオブジェクトをソートしたあと上書きされるので、新しいオブジェクトを作るsorted関数とは使い道が異なるのだ。

list = [9, 2, 3, 1, 8, 5, 4]
list.sort()
list # [1, 2, 3, 4, 5, 8, 9]

zip関数

複数のタプルやリストを、一つのリストとして受け取ることができる。

よく利用される例としてはfor文と一緒に使われる例が挙げられる。

seq1 = ['101', '102', '103']
seq2 = ['taro', 'jiro', 'saburo']

for num, name in zip(seq1, seq2):
    print(num + ' : ' + name)

# 以下、出力結果
101 : taro
102 : jiro
103 : saburo

なお、zip関数の引数として指定したシーケンスの要素数がそれぞれ異なる時は、数の少ない方が優先され、余った要素は処理がされない。

seq1 = ['101', '102', '103']
seq2 = ['taro', 'jiro']

for num, name in zip(seq1, seq2):
    print(num + ' : ' + name)

# 以下、出力結果
101 : taro
102 : jiro

また、少し特殊な記法だが以下のようにzip化されたシーケンスを分解することもできる。

list = [('101', 'taro'), ('102', 'jiro'), ('103', 'saburo')]
num, name = zip(*list)

num # ('101', '102', '103')
name # ('taro', 'jiro', 'saburo')

ポイントは2行目のlist前のアスタリスク(*)だ。
引数として指定されたタプルやリストの前にアスタリスクを付けると、引数のシーケンスが分解され、サンプルコードのように分解したものをそれぞれ別の変数に代入することができる。

reversed関数

引数に指定したシーケンスを逆順に処理する関数だ。

reversed関数単体で動かしても実体化されないので何も起きないという特徴を持つ。

for文などで使って初めて実体化される。

reversed(range(10)) # 実体化されないので何も起きない

for i in reversed(range(10)): # このとき初めて実体化される
    print(i)

zip関数の使い方はしっかり押さえておこう

いくつかのPython組み込み関数を紹介してきたが、全て一気に覚える必要はない。

だが、zip関数は今後の学習で頻繁に登場するので、使い方をしっかり理解しておいた方が良いだろう。