Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】TypeError: can only concatenate list (not "int") to list エラーの原因と解決方法

リストは他のリストと連結することができます。つまり、あるリストの中身を別のリストに追加できるということです。しかし、整数など他のデータ型の値をリストに連結することはできません。

リストに整数を連結しようとすると、Pythonインタープリタは「TypeError: can only concatenate list (not "int") to list」というエラーを返します。

この記事では、このエラーの意味や仕組みを解説し、実際のコード例をもとに問題を修正する方法をわかりやすく紹介します。

TypeError: can only concatenate list (not "int") to list エラーとは

連結(concatenation)を使うと、2つのリストを簡単に結合できます。extend()メソッドを使ってリストを別のリストに追加することもできますが、連結の場合はプラス記号(+)というたった1つの記号だけで済むのが特徴です。

連結できるのはリストだけではありません。辞書やタプルなど、イテラブル(反復可能)なオブジェクトであれば連結できます。

ただし、異なるデータ型のオブジェクト同士は連結できません。つまり、リストと辞書、あるいは整数とリストを連結することはできないのです。

連結演算子を使ってリストに単一の整数を追加しようとすると、「TypeError: can only concatenate list (not "int") to list」エラーが発生します。

エラーが発生する具体例

ここでは、金曜日のカフェで特定のサンドイッチが何回注文されたかを集計するプログラムを作成してみましょう。75回以上注文されたサンドイッチだけを抽出し、最も人気のあるサンドイッチを確認するのが目的です。

まず、サンドイッチの名前のリストと、それぞれの注文数を格納するリストの2つを定義します。

sandwiches = ["Egg and Cress", "Chicken Club", "Hummus and Tomato", "Cheese"]
orders = [54, 77, 22, 98]

これらのリストは、それぞれ変数「sandwiches」と「orders」に代入されています。次に、75回以上注文されたサンドイッチのインデックス番号を記録するための空のリストを用意します。

orders_75 = []

現時点でこのリストが空なのは、まだどのサンドイッチが75回以上注文されたのかを判定していないためです。

続いて、forループを使ってサンドイッチと注文数のリストを走査し、75回より多く注文されたサンドイッチを見つけます。

for s in range(0, len(sandwiches)):
	if orders[s] > 75:
		orders_75 = orders_75 + s

このコードは、0から「sandwiches」リストの長さまでの範囲を1つずつループ処理します。サンドイッチに対応する「orders」リストの値が75より大きければ、そのサンドイッチのインデックス位置を「orders_75」リストに追加する、という流れです。

さらに、プログラムが正しく動作しているか確認するため、75回以上注文されたサンドイッチの名前を出力するforループを記述します。

for o in orders_75:
	print(sandwiches[o])

それでは、このPythonコードを実行して結果を確認してみましょう。

Traceback (most recent call last):
  File "main.py", line 9, in <module>
	orders_75 = orders_75 + s
TypeError: can only concatenate list (not "int") to list

コードがエラーを返しました。

解決策

まず、エラーメッセージに示されたコード行を見てみましょう。

	orders_75 = orders_75 + s

ここでは、整数値をリストに連結しようとしています。連結は同一データ型のイテラブルオブジェクト同士でしか機能しないため、この操作は不可能です。

このエラーを解決するには、append()メソッドを使ってリストに項目を追加します。このメソッドはリストへの要素追加のために特別に設計されたものであり、辞書・整数・浮動小数点数など、どんなデータ型の項目でも追加できます。

先ほどの「orders_75」の行を、append()メソッドを使う形に書き換えます。

	orders_75.append(s)

append()メソッドはリストに直接(in-placeで)項目を追加するため、「orders_75」に改めて値を代入する必要はありません。修正後のコードを実行してみましょう。

Chicken Club
Cheese

今度は、75回以上注文されたサンドイッチの一覧が出力されました。条件を満たしたのは「Chicken Club」と「Cheese」の2つです。

まとめ

「TypeError: can only concatenate list (not "int") to list」エラーは、リストに整数を連結しようとしたときに発生します。

このエラーは、連結できるのがリスト同士のみであることが原因です。解決するには、append()メソッドを使ってリストに項目を追加しましょう。

これであなたも、プロのようにこのPythonエラーを解決できるはずです!

  1. Pythonでリスト内の隣接する単語のみを結合する方法

    この記事では、Pythonのリストに含まれる隣接する単語(文字列)だけを結合し、数字はそのまま残す方法を解説します。以下の手順に沿って問題を解いていきましょう。解決の手順リストを初期化するisalphaメソッドを使って、数字以外の単語を抽出するjoinメソッドで単語同士を結合するisdigitメソッドで数字を抽出し、結果の末尾に追加する結果を出力する方法1: リスト内包表記を使うまずは、リスト内包表記を使って単語と数字をそれぞれ抽出する方法から見ていきます。# リストの初期化 strings = [Tutorials, 56, 45, point, 1, 4] # 結果格納用のリスト res

  2. Pythonのin演算子を高速化するには?リストからセット・辞書への切り替えが鍵

    Pythonのin演算子がリストで遅い理由 Pythonのin演算子をリスト(list)に対して使用すると、計算量はO(n)になります。これは、指定した要素が見つかるまでリストの先頭から順番にすべての要素を走査していくためです。そのため、リストのサイズが大きくなるほど、存在判定にかかる時間は線形に増加してしまいます。 セットや辞書なら約O(1)で高速検索が可能 同じ「要素が含まれているか」の判定でも、セット(set)や辞書(dict)といったハッシュベースのデータ構造を使えば、平均的にO(1)——つまりほぼ一定の時間——で検索できます。内部でハッシュテーブルが採用されているおかげで、データ量