Pythonのアンパック機能:リストやタプルの要素を変数に一括代入する方法

Pythonでリスト(list)やタプル(tuple)を扱う際、その要素を個別の変数に取り出して使いたいことがよくあります。

例えば、座標データを扱う場合、以下のようにインデックスを指定して取り出すのが通常です。

point = (100.5, 35.2)

# 通常のインデックス参照
lat = point[0]
lon = point[1]

この方法は確実ですが、要素数が多くなると記述が冗長になります。

Pythonには、このようなシーケンス(リストやタプルなど)の要素を、一度に複数の変数に展開して代入する「アンパック(Unpacking)」という強力な機能があります。

この記事では、アンパックの基本的な使い方と、使用上の注意点について解説します。

目次

1. 基本的なアンパック

アンパックの構文は非常にシンプルです。代入演算子(=)の左辺に、シーケンスの要素数と同じ数の変数名をカンマ区切りで並べます。

# 3つの要素を持つリスト
user_profile = ["Tanaka", 45, "Tokyo"]

# 3つの変数でアンパックする
name, age, city = user_profile

print(f"名前: {name}")
print(f"年齢: {age}")
print(f"都市: {city}")

実行結果:

名前: Tanaka
年齢: 45
都市: Tokyo

user_profile[0]name に、user_profile[1]age に、user_profile[2]city に、それぞれ自動的に代入されます。この機能はタプルでも全く同じように動作します。

2. 注意点:要素数と変数名の数を一致させる (ValueError)

アンパックの基本的なルールは、「左辺の変数名の数」と「右辺のシーケンスの要素数」が厳密に一致していることです。

この数が一致しない場合、ValueError が発生し、プログラムは停止します。

エラー例1:変数の数が少なすぎる (too many values to unpack)

右辺の要素数に対して、左辺の変数名が足りない場合です。

# 3つの要素を持つリスト
rgb_color = [255, 0, 128]

# 2つの変数で受け取ろうとする
# r, g = rgb_color
# ValueError: too many values to unpack (expected 2)

Pythonは 255r に、0g に代入しましたが、128 を代入する変数が残っていないためエラーとなります。

エラー例2:変数の数が多すぎる (not enough values to unpack)

右辺の要素数に対して、左辺の変数名が多すぎる場合です。

# 3つの要素を持つリスト
rgb_color = [255, 0, 128]

# 4つの変数で受け取ろうとする
# r, g, b, alpha = rgb_color
# ValueError: not enough values to unpack (expected 4, got 3)

r, g, b には代入できましたが、alpha に代入するための4番目の要素が存在しないためエラーとなります。

3. アスタリスク (*) を使った柔軟なアンパック

前述の ValueError を回避し、より柔軟にアンパックを行うための構文として、アスタリスク(*)があります。

* を付けた変数は、残りの要素をリストとしてまとめて受け取ります。

# 複数のデータが含まれるログ
log_data = ["2025-11-14", "10:30:05", "ERROR", "Auth Failed", "User: admin"]

# 先頭の2つと、残りをすべて *details に格納
date, time, *details = log_data

print(f"日付: {date}")
print(f"時刻: {time}")
print(f"詳細 (リスト): {details}")

実行結果:

日付: 2025-11-14
時刻: 10:30:05
詳細 (リスト): ['ERROR', 'Auth Failed', 'User: admin']

* は先頭や中間に置くこともできます。

# 最初と最後だけが必要な場合
scores = [90, 85, 88, 76, 92]
first, *middle_scores, last = scores

print(f"初回スコア: {first}")
print(f"中間スコア: {middle_scores}")
print(f"最終スコア: {last}")

実行結果:

初回スコア: 90
中間スコア: [85, 88, 76]
最終スコア: 92

まとめ

  • アンパック(a, b = [1, 2])は、リストやタプルの要素を複数の変数に一括代入する機能です。
  • 基本的に、左辺の変数名と右辺の要素数は一致させる必要があります。一致しない場合 ValueError が発生します。
  • *(アスタリスク)を変数名の前に付けることで、残りの要素をリストとして受け取る、柔軟なアンパックが可能です。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次