sec02 - Pythonアンパック入門|list・tuple・set・dictを効率的に展開する方法
スポンサーリンク

Pythonのアンパック(複数代入)とは?

このレクチャーでは、アンパックという操作を学びます。

アンパックとは、『データ構造(listやtupleなど)から複数の値を一度に取り出し、複数の変数に代入する』処理のことです。日付や座標など、複数の関連したデータを扱うときに便利です。

listとtupleをアンパックする方法

listやtupleの要素を、順番に変数へ代入することができます。year, month, day = [2025, 10, 5]のように記述することで、変数year2025が、変数month10が、変数day5がそれぞれ代入されます。

listやtupleは、要素番号で情報を管理する必要があり、どの要素番号に何のデータが存在しているのかが分かりにくいという欠点があります。分かりやすい変数名を付けたうえで、listやtupleで取得したデータを各変数に代入することで、コードの処理が分かりやすくなるというメリットがあります。

なお、アンパックを使うときの注意点ですが、list/tupleの要素数と変数の数を一致させる必要があり、数が合わなければエラーになります。

# 年/月/日
year, month, day = [2025, 10, 5]
print(year, month, day)  # 2025 10 5

# '年-月-日'のような文字列を取得した時に、各要素を分解する例
date_str = '2025-09-30'
year, month, day = date_str.split('-')  # splitで文字列を'-'で分割 → ['2025','09','30']
print(year, month, day)  # '2025' '09' '30' (文字列なので、数値で扱いたい時はint()で変換する)

# 座標を扱うとき
coordinates = (35.6895, 139.6917)   # 東京の緯度・経度
lat, lon = coordinates
print('緯度:', lat)  # 緯度: 35.6895
print('経度:', lon)  # 経度: 139.6917
スポンサーリンク

アスタリスク(*)を使ったアンパック

*varのように記述すると、その変数に余った要素をlistにして代入されます。

先ほどの例で、要素の数と変数の数を合わせなければならないとお話ししたばかりなのですが、変数のどれか1つにアスタリスク(*)を付けることで、listに変換された残りの要素がその変数に代入されます。

例えば、多くの要素を持っているlistの中から、最初と最後のデータのみ欲しいとしましょう。その時にfirst, *middle, last = numbersのように記述することで、1番最初の要素が変数firstに、1番最後の要素が変数lastに代入され、残りの要素がlistの形で変数middleに代入されることになります。

numbers = [10, 20, 30, 40, 50]
first, *middle, last = numbers
print(first)   # 10
print(middle)  # [20, 30, 40]
print(last)    # 50

この場合の注意点としては、『list/tupleの要素数は、アスタリスクの付いていない変数の数以上でなければならない』という点です。アスタリスクの付いていない変数には少なくとも値が代入されるように、list/tupleの要素が存在している必要があります。なお、アスタリスクの付いている変数への値の数は0でも問題ありません。(その場合、空のlistが代入されます。)

# OKな例: アスタリスクの付いていない変数の数以上の要素が存在する
numbers = [10, 20]
first, *middle, last = numbers
print(first)   # 10
print(middle)  # []  (middleへ割り当てられる要素は0でも問題ない)
print(last)    # 20

# NGな例: listの要素数が足りない
# (変数lastに代入される要素が存在しない)
numbers = [10]
first, *middle, last = numbers

setをアンパックする注意点

setからもアンパック可能です。ただし、setは順序が保証されていないため、どの変数にどの値が入るかは実行されるまでわかりません。

a, b, c = {100, 200, 300}
print(a, b, c)  # 200 100 300

dictのアンパック(keys, values, itemsの展開)

dictをそのままアンパックすると各keyが変数へ代入されます。

また、values()メソッドで、valueの値を取り出したものをアンパックできます。

items()メソッドを使うと、(key, value)のペアをアンパックすることもできます。

※ dictの講義でも解説しましたが、各要素の順序が保証されるのはPython 3.7 以降に限定されるので、それよりも前のバージョンを使用される場合は順序が変わることを前提にコードを記述する必要があります。

profile = {'name': 'Nico', 'age': 10}

# 各keyが代入されます
key1, key2 = profile
print('key1:', key1)  # key1: name
print('key2:', key2)  # key2: age

# 値をアンパックします
name, age = profile.values()  # dictの順序保証は Python 3.7 以降に限定
print('名前:', name)  # 名前: Nico
print('年齢:', age)   # 年齢: 10

# (key, value)のペアを取り出し、アンパックする
first_pair, second_pair = profile.items()
print(first_pair)   # ('name', 'Nico')
print(second_pair)  # ('age', 10)
スポンサーリンク