『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

zip,zip_longest,enumerate

zip()

Pythonzip() は複数のイテラブル・オブジェクトを受け取って、各イテラブルから要素を集めたタプルの イテレータ を生成します。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]

コメント