できない.dev

Python で「too many values to unpack」が解決できない

ValueError: too many values to unpack (expected N) は、右辺の要素数が左辺の変数の数より多いときに出る。
数を合わせるか、スター付き変数 *rest で残りをまとめて受け取る。
dict のループや split の列数ずれが定番の原因。

公開: 更新:

要約

ValueError: too many values to unpack (expected 2) は、アンパック代入で右辺の要素数が左辺の変数より多いときに発生します。
逆に少ない場合は not enough values to unpack になります。
要素数をそろえるのが基本で、数が可変なら *rest で残りをまとめて受け取ります。

ValueError: too many values to unpack (expected 2)

よくある原因

  1. 数の不一致: a, b = [1, 2, 3] のように左右の数が合っていない。
  2. dict のループ: for k, v in d: と書くと、dict のイテレーションはキーだけを返すため、キー(文字列)を 2 つにアンパックしようとして失敗する。.items() が必要。
    なお、キーの文字数によって too many values / not enough values とエラー種別が変わる(原因は同じ)。
  3. split の列数ずれ: name, value = line.split('=') で、値の中にも = が含まれる行があると 3 要素以上になる。
  4. 戻り値の取り違え: 関数が 3 要素のタプルを返すのに 2 変数で受けている。

解決策

1. 要素数をそろえる

左辺と右辺の数を一致させます。
アンパックの仕様は 代入文の公式ドキュメント(新しいタブで開く) に定義されています。

a, b, c = [1, 2, 3] # 3 個ずつでOK

2. スター付き変数で残りを受ける

数が可変なら、先頭だけ取り出して残りをリストでまとめられます。

first, *rest = [1, 2, 3, 4]
# first = 1, rest = [2, 3, 4]
 
*init, last = [1, 2, 3, 4]
# init = [1, 2, 3], last = 4

3. dict は items() で回す

d = {"a": 1, "b": 2}
 
for k, v in d.items(): # .items() を付ける
    print(k, v)

.items() を付けないと for k, v in d: がキーだけを返し、アンパックに失敗します。

4. split は maxsplit で制限する

line = "url=https://example.com/?a=1"
key, value = line.split("=", maxsplit=1)
# key = "url", value = "https://example.com/?a=1"

maxsplit=1 で「最初の区切りだけで分割」できるので、値の中に区切り文字が含まれていても 2 要素に収まります。

実行例

実際に上記の手順を python:3.12(Debian GNU/Linux 13)環境で動かすと、a, b = [1, 2, 3]ValueError: too many values to unpack (expected 2) で終了コード 1 となり、スター変数・.items()maxsplit=1 の各解決策はいずれも期待どおりの出力を返しました。

$ python bad.py
Traceback (most recent call last):
  File "/tmp/tmp.vdXyJ4XCIs/bad.py", line 1, in <module>
    a, b = [1, 2, 3]
    ^^^^
ValueError: too many values to unpack (expected 2)
終了コード: 1
$ python bad_dict.py
ValueError: not enough values to unpack (expected 2, got 1)

なお bad_dict.py が too many ではなく not enough になっているのは、for k, v in d: が dict のキー文字列そのものをアンパックするためである。
キーが 1 文字なら not enough values、3 文字以上なら too many values と表示が変わるが、原因はどちらも .items() の付け忘れで同じである。

$ python solve_star.py
そろえる: 1 2 3
first/rest: 1 [2, 3, 4]
$ python solve_items.py
a = 1
b = 2
$ python solve_maxsplit.py
url -> https://example.com/?a=1

— 2026-08-03 時点の出力

この記事は役立ちましたか?