Skip to content

3.5 アンパック

Pythonにおける「アンパック(Unpacking)」とは、リストやタプル、辞書などの複数の要素を持つまとまったデータ(イテラブル)を、複数の変数に一度に展開して代入する機能のことです。

アンパックを活用することで、インデックス([0][1])を指定して1つずつ値を取り出す手間が省け、コードがより短く、直感的で読みやすくなります。

最も基本的なアンパックは、リストやタプルの要素数と、受け取る変数の数を一致させて代入する方法です。

# タプルのアンパック
user_info = ("Alice", 25, "Tokyo")
name, age, city = user_info
print(name) # 出力: Alice
print(age) # 出力: 25
# リストのアンパックも同様です
coordinates = [35.6812, 139.7671]
lat, lng = coordinates

注意点: 右辺の要素数と左辺の変数の数が一致していない場合、ValueError が発生します。

2. アスタリスク (*) を使った高度なアンパック

Section titled “2. アスタリスク (*) を使った高度なアンパック”

Python 3では、アスタリスク(*)を使用することで、一部の要素だけを変数に取り出し、残りの要素をリストとしてまとめて受け取ることができます。

2.1 残りの要素をまとめて受け取る

Section titled “2.1 残りの要素をまとめて受け取る”

変数の前に * をつけると、割り当てられなかった残りのすべての要素がリストとしてその変数に代入されます。

numbers = [1, 2, 3, 4, 5]
# 最初の要素と、残りの要素に分ける
first, *rest = numbers
print(first) # 出力: 1
print(rest) # 出力: [2, 3, 4, 5]
# 最初と最後の要素を取り出し、中間をまとめる
head, *middle, tail = numbers
print(head) # 出力: 1
print(middle) # 出力: [2, 3, 4]
print(tail) # 出力: 5

※1つの代入文の中で * を使えるのは1回(1つの変数)だけです。複数使うと SyntaxError になります。

リストやタプルなどのリテラル内で * を使うと、そのイテラブルを展開して新しいリストなどに含めることができます。

list1 = [1, 2]
list2 = [3, 4]
# リストを展開して1つの新しいリストに結合
merged = [0, *list1, *list2, 5]
print(merged) # 出力: [0, 1, 2, 3, 4, 5]

辞書(dict)に対しては、ダブルアスタリスク(“)を使用してキーと値のペアを展開します。主に新しい辞書を作成する際の結合や、関数へのキーワード引数として利用されます。

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# 辞書を展開して結合
merged_dict = {**dict1, **dict2}
# 同じキー('b')がある場合は、後から展開された値で上書きされます
print(merged_dict)
# 出力: {'a': 1, 'b': 3, 'c': 4}

4. 関数呼び出しにおけるアンパック

Section titled “4. 関数呼び出しにおけるアンパック”

アンパックは、「3.4 関数の引数」で解説した可変長引数(*args, kwargs)と表裏一体の関係にあります。関数を「呼び出す」際にアンパックを使うことで、リストや辞書の中身を引数として渡すことができます。

def print_vector(x, y, z):
print(f"X: {x}, Y: {y}, Z: {z}")
# リストを展開して位置引数として渡す
vec_list = [10, 20, 30]
print_vector(*vec_list)
# 辞書を展開してキーワード引数として渡す
vec_dict = {'x': 100, 'y': 200, 'z': 300}
print_vector(**vec_dict)

アンパックをマスターすることで、データの抽出や結合、関数への引数渡しなどを、よりPythonらしくスマートに記述できるようになります。