複数のリストの要素をまとめて取得する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)
0 件のコメント :
コメントを投稿