【Python】配列などのまとまったデータをバラバラに取得する方法【アンパック】

Python

この記事では、Pythonのアンパックについて解説します。アンパックとは、配列に格納されている要素を、バラバラに分解して、それぞれ変数に代入することです。

また、関数などの引数に、リストや辞書をアンパックして渡すこともできます。

アンパックの基本的な使い方

アンパックするには、配列の要素の数だけ変数を用意する必要があります。

タプル

point = (1, 2, 3)

# アンパック 
# 「,」で繋いで要素をそれぞれ受け取る
# タプルの要素が3つなので変数も3つ用意
x, y, z = point

print(x)
# 1

print(y)
# 2

print(z)
# 3

リスト

q = ['name', 'age', 'gender'] 
name, age, gender = q 

print(name) 
# name 

print(age) 
# age 

print(gender) 
# gender

文字列もアンパックすることができます。

s = 'ABC'
a, b, c = s

print(a)
# A

print(b)
# B

print(c)
# C

辞書のアンパック

辞書型もアンパックすることができます。

d = {'one': 1, 'two': 2, 'three': 3}

k1, k2, k3 = d

print(k1)
# one

print(k2)
# two

print(k3)
# three

それぞれの変数に辞書のkeyを受け取ることができました。

もう少し複雑な配列 [ネストされた配列]

ネストされている配列もアンパックすることができます。

t = (1, (2, 3))
a, b, = t

print(a)
# 1

print(b)
# (2, 3)

ネストされた部分も展開したい場合は「()」や「[]」で囲うことで実現できます。

t = (1, (2, 3))
a, (b, c) = t

print(a)
# 1

print(b)
# 2

print(c)
# 3

必要ない値の受け取り [アンダースコア(_)]

特に必要ない値がある場合は、その値をアンダースコアで受け取りましょう!
アンダースコアで受け取ることで、必要ない値であることがすぐに解り、間違って使ってしまうこともなくなります。

point = (1, 2, 3)
x, y, _ = point

print(x)
# 1

print(y)
# 2

print(_)
# 3

アンダースコアは複数指定できます。

point = (1, 2, 3)
x, _, _ = point

print(x)
# 1

print(_)
# 3

複数の要素を受け取る [アスタリスク(*)]

変数にアルタリスク(*)をつけることで複数の要素を受け取ることができます。

以下コードでは、配列の要素の数に対して変数の数が少ないが、アスタリスクの付いた変数があるため要素を複数受け取ってくれる。

t = (1, 2, 3)

a, *b = t

print(a)
# 1

print(b)
# [2, 3]

当然、前の変数にも付けることができる。

t = (1, 2, 3)

*a, b = t

print(a)
# [1, 2]

print(b)
# 3

ちなみに、ネストされている配列をアスタリスクの付いた変数で受け取ると以下のようになります。

t = (1, (2, 3))

a, *b= t

print(a)
# 1

print(b)
# [(2, 3)]

注意

アスタリスクを付けた変数で値を受け取ると、必ずリスト型として受け取られます。

t = (1, 2, 3)

*a, b, c = t

print(a)
# [1]

また、複数付けることはできません。

# これはエラー
*a, *b = t

アンパックして関数に渡す

リストやタプル、辞書をアンパックして関数などの引数に渡すことができます。

リスト・タプルの場合 [*リスト名 / *タプル名]

例えば、以下のような関数があったとします。

def func(a, b):
    print(a)
    print(b)

この関数に、配列の要素を引き渡そうとすると以下のようになります。

vals = [1, 2]

func(vals[0], vals[1])
# 1
# 2

しかし、アンパックすることで以下のように記述することができます。

func(*vals)
# 1
# 2

特に可変長引数の場合はとても楽に値を引き渡せます。

def func(*args):
    for arg in args:
        print(arg)


vals = [1, 2, 3]

# 通常
func(vals[0], vals[1], vals[2])
# 1
# 2
# 3

# アンパック
func(*vals)
# 1
# 2
# 3

辞書の場合 [**辞書名]

辞書をアンパックして引数に渡すと、辞書のkeyとvalueを使ってキーワード呼び出しをします。

キーワード呼び出しとは、引数名を指定して値を渡すことです。

def func(a, b):
    print(a)
    print(b)

# キーワード呼び出し
func(a=1, b=2)
# 1
# 2

これを辞書を使って表現すると、以下のようになります。

d = {'a': 1, 'b': 2}

func(**d)
# 1
# 2

辞書をアンパックして渡すには、辞書名の前にアスタリスクを2つ付けます。

この呼び出しは、以下のようになっています。

辞書 = {key1: val1, key2,: val2}

関数(**辞書) = 関数(key1=val1, key2=val2)

もちろん、可変長引数にも使えます。

def func(**kwargs):
    print(kwargs)

d = {'one': 1, 'two': 2, 'three': 3}

func(**d)
# {'one': 1, 'two': 2, 'three': 3}

アスタリスクを1つに

実は、アスタリスクを1つにしても辞書はアンパックして関数の引数に渡すことができます。

その場合、keyのみが渡されます。

def func(*args):
    for arg in args:
        print(arg)


d = {'one': 1, 'two': 2, 'three': 3}

func(*d)
# one
# two
# three

番外編: 文字列もできる

文字列もアンパックして関数の引数に渡すことができます。

def func(*args):
    for arg in args:
        print(arg)


s = 'ABC'

func(*s)
# A
# B
# C

タイトルとURLをコピーしました