できない.dev

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

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

#python#valueerror#unpacking#tuple#exception

公開: 更新:

要約

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() が必要。
  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 要素に収まります。

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