zip()関数とenumerate()関数

zip()関数とenumerate()関数

zip()関数

 zip()関数は複数のイテラブル・オブジェクトを受け取って、各イテラブルから要素を集めたタプルのイテレータを生成します。k 番目のタプルは各イテラブルの k 番目の要素を集めたタプルです。タプルは next()関数で順番に取り出すことができます。

# 数学者のリスト
mathematician = ["クンマー", "リーマン", "カントール"]

# 主な功績
achievement = ["理想数", "リーマン積分", "集合論"]

# リストをまとめてイテレータを生成
my_iter = zip(mathematician, achievement)

print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
('クンマー', '理想数')
('リーマン', 'リーマン積分')
('カントール', '集合論')

イテラブルの要素数が異なる場合

 zip() の引数に異なる長さのイテラブルを渡すこともできますが、イテレータの要素数は最短のイテラブルの要素数に合わせられます

# 数学者のリスト
mathematician = ["ヤコビ", "ガロア", "ストークス"]

# 主な功績
achievement = ["楕円関数", "ガロア理論"]

# リストをまとめてイテレータを生成
my_iter = zip(mathematician, achievement)

print(list(my_iter))
[('ヤコビ', '楕円関数'), ('ガロア', 'ガロア理論')]

 

複数リストのループ処理

 zip()関数によって生成されたイテレータの前に複数の変数を添えてループ処理を実行する場合、k 番目に記述した変数はタプルの k 番目の要素に対応します。

# 数学者のリスト
mathematician = ["高木貞治", "ポアンカレ", "ハウスドルフ"]

# 主な功績
achievement = ["類体論", "ポアンカレ予想", "ハウスドルフ空間"]

# リストをまとめてイテレータを生成
my_iter = zip(mathematician, achievement)

for x, y in my_iter:
    print(x, ":", y)
高木貞治 : 類体論
ポアンカレ : ポアンカレ予想
ハウスドルフ : ハウスドルフ空間

 

enumerate()関数

 enumerate()関数は受け取ったイテラブル・オブジェクトのインデックス番号と要素をイテレータとして返します

# 数学者のリスト
mathematician = ["クロネッカー", "ヤーノシュ", "デデキント"]

# インデックス番号と要素のタプルのイテレータを生成
my_iter = enumerate(mathematician)

print(list(my_iter))
[(0, 'クロネッカー'), (1, 'ヤーノシュ'), (2, 'デデキント')]

 startオプションで開始番号を指定することもできます。

# 数学者のリスト
mathematician = ["フィールズ", "ワイエルシュトラス", "リウヴィル"]

# インデックス番号と要素のタプルのイテレータを生成
my_iter = enumerate(mathematician, start = 1)

print(list(my_iter))
[(1, 'フィールズ'), (2, 'ワイエルシュトラス'), (3, 'リウヴィル')]

 リストの各要素に同じ処理を施したい場合にも enumerate()関数が使えます。

# 数値のリスト
num_list = [1, 3, 5, 7, 9]

# リストのインデックス番号と要素を返すイテレータを作成
my_iter = enumerate(num_list)

# リストの各要素を2乗
for i, j in my_iter:
    num_list[i] = j ** 2

print(num_list)
[1, 9, 25, 49, 81]