PythonのTypeError「list indices must be integers or slices, not float」エラーの原因と解決策
PythonのTypeError:リストインデックスは整数またはスライスである必要があります
Pythonでは、リストの要素にはインデックス番号を使ってアクセスします。このインデックスには整数値を使用しなければなりません。浮動小数点数(float)でリストの要素にアクセスしようとすると、「TypeError: list indices must be integers or slices, not float」というエラーが発生します。
この記事では、このエラーの意味と発生原因を解説し、実際のコード例を通して修正方法をわかりやすく紹介します。
エラーの意味
リストに要素を追加すると、各要素には自動的にインデックス値が割り当てられます。インデックスは0から始まり、要素が追加されるごとに1ずつ増加します。つまり、リストの最初の要素のインデックスは0、2番目の要素は1、という具合です。これにより、個々の要素へ簡単にアクセスできます。
一方、浮動小数点数を使ってリストから要素を取得することはできません。浮動小数点数は整数とは異なるデータ型であり、Pythonでは別の扱いを受けます。リストは整数によるインデックスを前提としているため、float型の値を指定するとエラーになってしまうのです。
エラーが発生するコード例
テニストーナメントの参加者情報を取得するプログラムを作成してみましょう。まず、リストの中にリストを持つ(ネストされた)リストを定義します。このリストには、トーナメントの全参加者の情報が格納されます。
participants = [
["Alex Rogers", 5, 2],
["Linda Patterson", 3, 4],
["Ruby Spencer", 1, 6]
]
このparticipantsリストには3つのリストが含まれており、それぞれ「参加者名」「勝利数」「敗北数」がこの順序で記録されています。参加者は勝利数の多い順に並んでいます。
次に、input()関数を使って、ユーザーに表示したいプレイヤーの順位を入力してもらいます。
player_to_find = float(input("検索したいプレイヤーの順位を入力してください: "))
ユーザーが入力する数値は、順位表におけるプレイヤーの位置に対応します。たとえばAlex Rogersは1位なので、彼の情報を見たい場合は「1」を入力します。
ここで、後のコードでインデックス操作を行うため、入力値をfloat()メソッドで浮動小数点数に変換しています。しかし、実はこれがエラーの原因となります。
続いて、インデックスを使って目的のプレイヤーを取得します。
player_info = participants[player_to_find - 1]
ユーザーが入力した値を使って、participantsリストから該当するプレイヤーのレコードを取り出します。「player_to_find」から1を引いているのは、リストのインデックスが0から始まるためです。順位表の1位の人は、リスト上ではインデックス0の位置に存在します。
最後に、この参加者の詳細をコンソールに出力します。
print("名前: {}".format(player_info[0]))
print("勝利数: {}".format(player_info[1]))
print("敗北数: {}".format(player_info[2]))
プレイヤーの名前、勝利数、敗北数をコンソールに表示する仕組みです。それではプログラムを実行してみましょう。
検索したいプレイヤーの順位を入力してください: 2
Traceback (most recent call last):
File "main.py", line 9, in <module>
player_info = participants[player_to_find - 1]
TypeError: list indices must be integers or slices, not float
順位を入力した時点で、エラーが発生してしまいました。
解決策
問題の原因は、input()で受け取った値をfloat()メソッドで浮動小数点数に変換している点にあります。その結果、participantsリストから要素を取得する際に、浮動小数点数でインデックスを指定することになり、エラーが発生したのです。
この問題を解決するには、ユーザーの入力値を浮動小数点数ではなく整数に変換します。int()メソッドを使いましょう。
player_to_find = int(input("検索したいプレイヤーの順位を入力してください: "))
入力値が整数になったので、インデックスを使ってリストから要素を取得できるようになりました。コードを再度実行して確認してみます。
検索したいプレイヤーの順位を入力してください: 2
名前: Linda Patterson
勝利数: 3
敗北数: 4
今度は、順位表の2位にいるプレイヤーのレコードが正しく表示されました。
まとめ
「TypeError: list indices must be integers or slices, not float」エラーは、浮動小数点数を使ってリストの要素にアクセスしようとしたときに発生します。このエラーを解決するには、リストの要素にインデックスでアクセスする際は必ず整数を使用してください。
なお、input()関数は常に文字列を返すため、数値として扱いたい場合はint()やfloat()で明示的に型変換が必要です。リストのインデックスに使う場合はint()を選ぶことを忘れずに。これであなたも、このエラーをプロのように素早く修正できるはずです!
-
Pythonでリストから重複する要素を抽出して表示する方法
この記事では、数値のリストの中から重複している要素(2回以上出現する、リスト内で一意ではない要素)をすべて抽出して表示するPythonプログラムを解説します。実行例入力: given_list = [3, 6, 9, 12, 3, 30, 15, 9, 45, 36, 12] 出力: desired_output = [3, 9, 12] 入力: given_list = [-27, 4, 29, -27, -2, -99, 123, 499, -99] 出力: desired_output = [-27, -99]負の数値が含まれる場合でも正しく動作することがわかります。重複要素を検出する
-
Pythonでリストが空かどうかを判定するプログラム
Pythonでは、リストが空かどうかを簡単に判定できます。この記事では、空のリストが与えられたときに、それが空であるかどうかを確認する方法を紹介します。ポイントは、暗黙的(implicit)な判定方法を使うことです。Pythonでは、空のリストはブール値として「偽(False)」と評価されるため、if not を使うことで簡潔にチェックできます。 アルゴリズム ステップ1:空のリストを用意します。 ステップ2:リストが空であれば 1 を返し、そうでなければ 0 を返します。 サンプルコード # リストが空かどうかをチェックするPythonコード def checklist(A):