ゼロからのPython入門講座タプルとコレクション コレクションのアンパック代入

タプルコレクションとシーケンスの基礎コレクションのアンパック代入

変数 では、代入文を使って、変数に値を代入する方法を解説しました。

普通の代入文は、右辺の値を、左辺に指定した変数に代入します。

In [52]:
variable = 1000   # variableに 1000 を代入
print(variable)
1000

右辺が、リストオブジェクトなどの コレクション であっても同じです。

In [54]:
variable = [1, 2, 3]   # variable にリストを代入
print(variable)
[1, 2, 3]

コレクションのアンパック代入

代入式の右辺がコレクションなどの場合、左辺に複数の変数名を指定して、コレクションの要素を一括して変数に代入できます。

たとえば、右辺が [1, 2, 3] のように、要素が3つあるリストの場合、左辺に (var1, var2, var3) と3つの変数名を指定できます。

In [56]:
list_obj = [1, 2, 3]
var1, var2, var3 = list_obj  # var1, var2, var3 に、list_objの要素を順に代入

print(var1, var2, var3)
1 2 3

このように記述すると、変数 var1var2var3 には、右辺のリストオブジェクトの要素が一つずつ順番に代入されます。この場合、var1 には list_obj の最初の要素である 1が、var2var3 には、それぞれ2番目と3番目になる 23 が代入されます。

このように、コレクションの要素を一括して変数に代入する方法を、アンパック(unpack) といいます。

右辺には、リストオブジェクト以外にタプルなどのコレクションも指定できます。

In [57]:
var1, var2, var3 = (1, 2, 3)  # タプルのアンパック
print(var1, var2, var3)
1 2 3

文字列を代入すると、1文字ずつ分割して代入されます。

In [60]:
var1, var2, var3 = "ABC" # 文字列のアンパック
print(var1, var2, var3)
A B C

アンパック代入を行う場合は、右辺のコレクションの要素数と、左辺に指定する変数の数が一致する必要があります。一致しない場合は、次のようなエラーになります。

In [61]:
var1, var2 = "ABC" # 文字列のアンパック
print(var1, var2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-61-08fa34f2a626> in <module>
----> 1 var1, var2 = "ABC" # 文字列のアンパック
      2 print(var1, var2)

ValueError: too many values to unpack (expected 2)

この例では、長さが3の文字列を、var1var2 という2つの変数に代入しようとしていますが、文字が一つ余ってしまうためにエラーとなります。

アンパックの使用例

アンパックを利用した代入は、Pythonプログラミングで頻繁に利用されます。

タプルの書き方 では、例として、東京都にある人形町駅の緯度と経度を、次のようなタプルで記述しました。

ningyocho = (35.686321, 139.782211)

このタプルから、駅の緯度と経度を取り出し、出力してみましょう。

タプルから値を取り出すには、インデックスを指定して値を取り出す方法があります。この方法で処理を記述すると、こうなります。

In [65]:
ningyocho = (35.686321, 139.782211)  # (緯度, 経度) のタプル

ido = ningyocho[0]  # ningyocho から緯度を取り出す
keido = ningyocho[1] # ningyocho から経度を取り出す

print("人形町は緯度:", ido, "経度:", keido)
人形町は緯度: 35.686321 経度: 139.782211

この書き方でも間違いではないのですが、2行にわけてそれぞれ緯度と経度を取り出すのは、ちょっとまだるっこしい感じがしませんか?

このような場合、アンパックを使うと、

In [ ]:
ningyocho = (35.686321, 139.782211)  # (緯度, 経度) のタプル

ido, keido = ningyocho  # ningyocho から緯度と経度を取り出す

print("人形町は緯度:", ido, "経度:", keido)

のように、一行ですっきりと記述出ます。

Copyright © 2001-2020 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト