zip()
Python の zip() は複数のイテラブル・オブジェクトを受け取って、各イテラブルから要素を集めたタプルの イテレータ を生成します。k 番目のタプルは各イテラブルの k 番目の要素を集めたタプルです。タプルは next() で順番に取り出すことができます。
# PYTHON_ZIP # In[1] # 数学者のリスト mathematician = ["クンマー", "リーマン", "カントール"] # 主な功績 achievement = ["理想数", "リーマン積分", "集合論"] # リストをまとめてイテレータを生成 my_iter = zip(mathematician, achievement) print(next(my_iter)) print(next(my_iter)) print(next(my_iter)) # ('クンマー', '理想数') # ('リーマン', 'リーマン積分') # ('カントール', '集合論')
zip() の引数に異なる長さのイテラブルを渡すこともできますが、イテレータの要素数は最短のイテラブルの要素数に合わせられます。
# In[2] # 数学者のリスト mathematician = ["ヤコビ", "ガロア", "ストークス"] # 主な功績 achievement = ["楕円関数", "ガロア理論"] # リストをまとめてイテレータを生成 my_iter = zip(mathematician, achievement) print(list(my_iter)) # [('ヤコビ', '楕円関数'), ('ガロア', 'ガロア理論')]
zip() によって生成されたイテレータの前に複数の変数を添えてループ処理を実行する場合、k 番目に記述した変数はタプルの k 番目の要素に対応します。
# In[3] # 数学者のリスト 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 # In[1] 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 # In[1] # 数学者のリスト mathematician = ["クロネッカー", "ヤーノシュ", "デデキント"] # インデックス番号と要素のタプルのイテレータを生成 my_iter = enumerate(mathematician) print(list(my_iter)) # [(0, 'クロネッカー'), (1, 'ヤーノシュ'), (2, 'デデキント')]
startオプションで開始番号を指定することもできます。
# In[2] # 数学者のリスト mathematician = ["フィールズ", "ワイエルシュトラス", "リウヴィル"] # インデックス番号と要素のタプルのイテレータを生成 my_iter = enumerate(mathematician, start=1) print(list(my_iter)) # [(1, 'フィールズ'), (2, 'ワイエルシュトラス'), (3, 'リウヴィル')]
リストの各要素に同じ処理を施したい場合にも enumerate()関数が使えます。
# In[3] # 数値のリスト 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]
コメント