Pythonの「ValueError: max() arg is an empty sequence」エラーの原因と解決策を徹底解説
max()メソッドは、少なくとも1つの値を含むシーケンスを渡した場合にのみ正しく機能します。
空のリストから最大値を取得しようとすると、「ValueError: max() arg is an empty sequence」というエラーが発生します。
この記事では、このエラーの意味と発生原因を解説し、具体的なコード例を通して解決方法をわかりやすく説明します。
ValueError: max() arg is an empty sequenceとは
max()メソッドは、リスト内の最大値を取得するための組み込み関数です。リスト内の最小値を取得するmin()メソッドと対になる存在です。
このメソッドが正しく動作するためには、max()に少なくとも1つの値を含むシーケンスを渡す必要があります。リストに要素が1つも存在しない場合、最大値は定義できないためです。検索対象となる項目が存在しない以上、「最大の項目」も存在し得ません。
なお、空のリストをmin()メソッドに渡した場合にも、同様のエラー「ValueError: min() arg is an empty sequence」が発生します。原因は同じで、値が1つもないリストから最小値を取得することはできないためです。
エラーが発生する具体例
ここでは、生徒が化学のテストで取得した最高点を求めるプログラムを作成してみましょう。まず、生徒のリストを定義します。
students = [
{ "name": "Ron", "grades": [75, 92, 84] },
{ "name": "Katy", "grades": [92, 86, 81] },
{ "name": "Rachel", "grades": [64, 72, 72] },
{ "name": "Miranda", "grades": [] }
]
生徒のリストには4つの辞書が含まれており、各辞書には生徒の名前と、これまでに取得した成績のリストが格納されています。Mirandaは化学のクラスに参加したばかりのため、まだ成績が1つもありません。
次に、forループを使って生徒のリストを順に処理し、各生徒の最高点と平均点を求めます。
for s in students:
highest_grade = max(s["grades"])
average_grade = round(sum(s["grades"]) / len(s["grades"]))
print("The highest grade {} has earned is {}. Their average grade is {}.".format(s["name"], highest_grade, average_grade))
このコードでは、max()関数で生徒の最高点を取得し、平均点は全成績の合計を成績の数で割って計算しています。さらに、round()メソッドで平均点を整数に丸めています。
コードを実行すると、次のようになります。
The highest grade Ron has earned is 92. Their average grade is 84.
The highest grade Katy has earned is 92. Their average grade is 86.
The highest grade Rachel has earned is 72. Their average grade is 69.
Traceback (most recent call last):
File "main.py", line 10, in <module>
highest_grade = max(s["grades"])
ValueError: max() arg is an empty sequence
コードはリストの4番目の要素に到達するまでは正常に動作します。Ron、Katy、Rachelの最高点と平均点は表示されていますが、Mirandaの値はどこにも表示されていません。
解決策
最初の3人の生徒に対してコードが正しく動作したのは、それぞれ少なくとも1つの成績を含むリストが存在していたからです。一方、Mirandaにはまだ成績がありません。
Mirandaに成績がないため、max()関数の実行に失敗します。max()は空のリストから最大値を取得できないのです。
このエラーを解決するには、リスト内の最高点を計算する前に、成績リストに値が含まれているかどうかを確認します。リストが空の場合は、ユーザーに別のメッセージを表示するようにしましょう。
if文を使って、計算を実行する前に生徒が成績を持っているかどうかをチェックします。
for s in students:
if len(s["grades"]) > 0:
highest_grade = max(s["grades"])
average_grade = round(sum(s["grades"]) / len(s["grades"]))
print("The highest grade {} has earned is {}. Their average grade is {}.".format(s["name"], highest_grade, average_grade))
else:
print("{} has not earned any grades.".format(s["name"]))
このコードでは、生徒が少なくとも1つの成績を取得している場合にのみ、最高点と平均点を計算します。成績がない場合は、その旨をユーザーに通知します。実行結果は次のとおりです。
The highest grade Ron has earned is 92. Their average grade is 84. The highest grade Katy has earned is 92. Their average grade is 86. The highest grade Rachel has earned is 72. Their average grade is 69. Miranda has not earned any grades.
最初の3人の生徒については、最高点と平均点が正常に計算されました。Mirandaの処理に到達した時点では、最高点と平均点を計算せず、「まだ成績を取得していない」ことを知らせるメッセージが表示されます。
まとめ
「ValueError: max() arg is an empty sequence」エラーは、max()メソッドで空のリストから最大値を取得しようとした際に発生します。
このエラーを解決するには、max()に渡すリストに必ず1つ以上の値が含まれていることを確認してください。if文やlen()関数などでリストが空かどうかを事前にチェックすることで、エラーを確実に回避できます。これで、プロのエンジニアのようにこの問題を解決できるようになりました!
-
Pythonで空の辞書(dict)を作成する2つの方法をわかりやすく解説
Pythonで空の辞書を作成する基本の方法 Pythonでは、代入文で波括弧 {} の中に要素を何も記述しないことで、空の辞書オブジェクトを作成できます。さらに、組み込み関数 dict() を引数なしで呼び出す方法でも、同じく空の辞書を生成できます。 方法1:波括弧 {} を使う 最もシンプルで一般的なのがこの方法です。変数に空の波括弧を代入するだけで、空の辞書が作られます。 >>> d1 = {} >>> d1 {} 方法2:dict() 関数を使う dict() は引数を指定せずに呼び出すと、空の辞書を返します。「これから辞書として扱う」という意
-
Pythonで空のリストを作成する方法|[]とlist()の2つの基本テクニック
Pythonでプログラムを書いていると、「まず空のリストを用意しておいて、あとからデータを追加していきたい」という場面によく出会います。たとえば、forループで条件に合う要素だけを集めるときや、ユーザー入力を順次蓄積するときなどが代表例です。 Pythonで空のリストオブジェクトを作成する方法は、大きく分けて2つあります。1つ目は、代入文で角括弧 [] の中に何も要素を書かない方法。2つ目は、組み込み関数 list() を引数なしで呼び出す方法です。 方法1:角括弧 [] を使って空のリストを作る 最もシンプルで広く使われているのがこの書き方です。角括弧の中を空にして代入するだけで、空のリ