zip(), zip_longest(), enumerate()

zip(), zip_longest(), enumerate()

zip()

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

# PYTHON_ZIP_01

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

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

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

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

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

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

# PYTHON_ZIP_02

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

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

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

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

 

複数リストのループ処理

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

# PYTHON_ZIP_03

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

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

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

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

 

itertools.zip_longest()

 itertools.zip_longest() は複数のイテラブルを受け取って、同じインデックスの要素をタプルにまとめたイテレータを生成します。

itertools.zip_longest(iter1 [,iter2 [...]], [fillvalue=None])

 渡されたイテラブルの長さが互いに異なる場合、fillvalue に指定した値で補います (デフォルトは None)。

# PYTHON_ZIP_LONGEST

import pprint
from itertools import zip_longest

# 科目コード
sc = ["SC201", "SC202", "SC203", "SC204", "SC205"]

# 履修科目
subjects = ["システムデータ解析",
            "データ指向モデリング",
            "プログラミング応用IC"]

# 科目コードと履修科目をペアにする
z = zip_longest(sc, subjects)

# イテレータをリストに展開
z = list(z)

pprint.pprint(z)
[('SC201', 'システムデータ解析'),
 ('SC202', 'データ指向モデリング'),
 ('SC203', 'プログラミング応用IC'),
 ('SC204', None),
 ('SC205', None)]

 

enumerate()

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

# PYTHON_ENUMERATE_01

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

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

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

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

# PYTHON_ENUMERATE_02

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

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

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

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

# PYTHON_ENUMERATE_03

# 数値のリスト
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]