[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技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology