[Python]zipとenumerateの使い方と組み合わせ方

2021年7月25日日曜日

Python

複数のリストの要素をまとめて取得するzipと、要素と要素のインデックスを取得するenumerateのそれぞれの使い方と組み合わせて使う方法を紹介します


zip

下記のようにzipを利用することができます

scores = [90, 80, 70, 60, 50]
students = ["A-san", "B-san", "C-san", "D-san", "F-san"]

for score, student in zip (scores, students):
    print(score, student)
# 90 A-san
# 80 B-san
# 70 C-san
# 60 D-san
# 50 E-san


このとき、2つのリストの要素数が一致している必要があります
要素数が一致していない場合、要素数が少ない方に合わせてfor文が実行されます


scores = [90, 80, 70, 60, 50]
students = ["A-san", "B-san", "C-san", "D-san", "E-san", "F-san"]

for score, student in zip (scores, students):
    print(score, student)

# 90 A-san
# 80 B-san
# 70 C-san
# 60 D-san
# 50 E-san
# scoresの要素数である5回までfor文が実行される


enumerate

下記のようにenumerateを利用する事ができます
scores = [90, 80, 70, 60, 50]

for index, score in enumerate (scores):
    print(index, score)
    
# 0 90
# 1 80
# 2 70
# 3 60
# 4 50


zip と enumerateを組み合わせる

下記のようにzipとenumerateを組み合わせて利用する事ができます
scores = [90, 80, 70, 60, 50]
students = ["A-san", "B-san", "C-san", "D-san", "E-san"]

for index, (score, students) in enumerate ( zip(scores, students) ):
    print(index, score, students)
    
# 0 90 A-san
# 1 80 B-san
# 2 70 C-san
# 3 60 D-san
# 4 50 E-san


またzipで指定した部分はタプルで書くことも可能です

scores = [90, 80, 70, 60, 50]
students = ["A-san", "B-san", "C-san", "D-san", "E-san"]

for index, (score, students) in enumerate ( zip(scores, students) ):
    print(index, score, students)
    
# 0 (90, 'A-san') 90 A-san
# 1 (80, 'B-san') 80 B-san
# 2 (70, 'C-san') 70 C-san
# 3 (60, 'D-san') 60 D-san
# 4 (50, 'E-san') 50 E-san


また、やや複雑度が上がりますが、enumerateを使わずに同様の目的を実現できます
この書き方は出力が入れ子にならないので値の参照時にミスが少なくなります

import itertools

scores = [90, 80, 70, 60, 50]
students = ["A-san", "B-san", "C-san", "D-san", "E-san"]

for item in list( zip(itertools.count(), scores, students) ):
    print(item, item[0], item[1], item[2])

# (0, 90, 'A-san') 0 90 A-san
# (1, 80, 'B-san') 1 80 B-san
# (2, 70, 'C-san') 2 70 C-san
# (3, 60, 'D-san') 3 60 D-san
# (4, 50, 'E-san') 4 50 E-san


下記の2パターンはエラーになる書き方となります

エラーになる書き方その①

scores = [90, 80, 70, 60, 50]
students = ["A-san", "B-san", "C-san", "D-san", "E-san"]

# zipの対象となるscore, studentsが括弧で囲まれていない
for index, score, students in enumerate ( zip(scores, students) ):
    print(index, score, students)
    
# ValueError: not enough values to unpack (expected 3, got 2)


エラーになる書き方その②

scores = [90, 80, 70, 60, 50]
students = ["A-san", "B-san", "C-san", "D-san", "E-san"]

# zipを使っていない
for index, score, students in enumerate ( (scores, students) ):
    print(index, score, students)
    
# ValueError: not enough values to unpack (expected 3, got 2)


AIエンジニア向けフリーランスならここがおすすめです

まずは無料会員登録

プロフィール

自分の写真
製造業に勤務する傍ら、日々AIの技術動向を調査しブログにアウトプットしています。 AIに関するご相談やお仕事のご依頼はブログのお問い合わせフォームか以下のアドレスまでお気軽にお問い合わせください。 bhupb13511@yahoo.co.jp

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology