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]
コメントを書く