Phython

【Python】タプルって何? タプルの使い方やアンパックについて詳しくご紹介!

本記事では、Pythonで用いられるデータ型の一つであるタプルについて、その使い方やタプルを用いてできることをご紹介していこうと思います。
そもそもタプルって何?という話から始まり、アンパックのやり方まで説明しているので、ぜひ最後まで見ていってください。

ちなみに、本ブログでは初心者の方でも理解できるように丁寧に説明しているので、全くの初心者という方も安心してください。

また、pythonをまだインストールしていないといった方は以下の記事を参考にしてインストールしてみましょう。

この記事でわかること

  • タプルについて
  • タプルの使い方
  • アンパックについて
  • タプルのメソッド

 タプルについて

まずは、タプルとはいったいどのようなもののことを指すのかについてご説明させていただこうと思います。

また、数値(int型、float型)や文字列(string型)、リスト(list型)についてよくわからないという方は、以下の記事から見ることをおすすめします。

タプルとは?

タプルとは、いくつかのデータを一つにまとめたものです。

データというのは、例えばint型やfloat型の数値であったり、string型の文字列であったりなんでもOKです。

とりあえず、これらのデータを複数用意してそれをひとまとまりにしたのがタプルというわけです。

<input>

tuple_int = (1, 2, 3, 4, 5)
tuple_string = ("apple", "banana", "orange", "tomato")

print(tuple_int, type(tuple_int))
print(tuple_string, type(tuple_string))

<output>

(1, 2, 3, 4, 5) <class 'tuple'>
('apple', 'banana', 'orange', 'tomato') <class 'tuple'>

上記コードの『tuple_int』も『tuple_string』も両方タプルなのですが、それぞれ要素の型が異なりますよね。

こういったように、整数や文字列をまとめて一つにしたものをタプルと呼びます。

要素の取り出し方

では、ここからはタプルの使い方をコードを用いてご紹介していこうと思います。

<input>

tuple = (1, 2, 3, 4, 5, 6, 7, 8)

# タプルの一部を取り出す
print(tuple[1])
print(tuple[-1])
print(tuple[1:3])
print(tuple[:2])
print(tuple[2:])
print(tuple[:])

<output>

2
8
(2, 3)
(1, 2)
(3, 4, 5, 6, 7, 8)
(1, 2, 3, 4, 5, 6, 7, 8)

まずはタプルの要素の取り出し方です。
リストの時と全く同じなので、リストに関する記事を読んでくださった方や、リストは理解できているといった方は読み飛ばしてもらって大丈夫です。

では、上記コードについて簡単に説明していきます。

『tuple[0]』と記述すればタプルの中の0番目の要素が出力されますし、『tuple[0:2]』と記述すればタプルの中の0番目から1番目の要素が出力されます。

ここで気を付けてほしいのが、tupleの要素は1番目からではなく0番目からスタートしていることと、『tuple[0:2]』では2番目の要素は含まないということです。初めのうちはややこしいと思いますが、徐々に慣れていきましょう。

また、要素の部分にマイナスの数を入れると、後ろから数えることになります。
『tuple[-1]』ならば後ろから1番目の要素、『tuple[-2]』ならば後ろから二番目の要素といった感じですね。

タプルを使用する上での注意点

<input>

tuple = (1, 2, 3, 4, 5, 6, 7, 8)

# 要素の変更
tuple[0] = 3
print(tuple)

<output>

# エラー
TypeError: 'tuple' object does not support item assignment

実はタプルでは『tuple[0] = 3』のように記述して要素の変更を行うといったことが出来ないんです。
じゃあ他の方法で要素の変更を行うのかと言ったらそうではありません。
そもそもタプルは要素の変更が行えないといったデータ型になっているんですね。

ここがリストなどの他のデータ型と異なるので忘れがちなのですが注意しましょう。

多重タプル

<input>

tuple = ((1, 2, 3), (4, 5, 6))

print(tuple)

<output>

((1, 2, 3), (4, 5, 6))

リスト同様このような形でタプルの中にタプルを作ることはできます。
しかし、もちろん要素の変更は行えないので、『print(tuple[0][1]) = 10』なんてコードを書いてもエラーが返ってきます。

タプルの中にリストを作成

タプルの中にタプルを作成するのみでなく、タプルの中にリストを作成することもできます。

<input>

tuple = ([1, 2, 3], [4, 5, 6])

print(tuple)
tuple[0][1] = 10
print(tuple)
tuple[0] = [10, 20, 30]
print(tuple)

<output>

([1, 2, 3], [4, 5, 6])
([1, 10, 3], [4, 5, 6])
# エラー
TypeError: 'tuple' object does not support item assignment

上記コードのようにタプルの中のリストの要素は変更できるのですが、タプルの要素を変更しようとするとエラーが出てしまいます。

【補足】その他の宣言方法

タプルには、先ほどまで使用していた『()』を用いた宣言方法の他にも、いくつかの宣言方法があるのでそれをご紹介していきたいと思います。

<input>

tuple1 = 1, 2, 3
tuple2 = (1,)
tuple3 = (1)

print(tuple1, type(tuple1))
print(tuple2, type(tuple2))
print(tuple3, type(tuple3))

<output>

(1, 2, 3) <class 'tuple'>
(1,) <class 'tuple'>
1 <class 'int'>

まず、inputの一行目のなのですが、このように『()』を省いて宣言することが可能です。
printを用いて出力すると、しっかりタプル型として認識されていると思います。

また、要素を一つしか持たないタプルを使用したい場合はinput二行目のように、要素の後ろに必ずカンマを打つようにしましょう。
カンマを打つとタプルとして認識されるのですが、カンマを忘れてしまうとint型と認識されてしまうため注意が必要です。

 アンパックについて

続いて、アンパックについて説明していこうと思います。
アンパックは非常に便利な機能なので、理解して使いこなせるようになりましょう。

アンパックとは?

アンパックとは、『複数の要素を持つものを分解して別々の変数に代入すること』を指します。

なのでタプルの場合は、各要素をバラバラにして、別々の変数に代入するといった感じですね。

では、実際の使い方をコードを用いて見ていきましょう。

アンパックの使い方

<input>

tuple= (10, 20, 30)

x, y, z = tuple
print(x)
print(y)
print(z)

<output>

10
20
30

今回のコードでは、要素が3つのタプルを使って3つの変数に値を代入していますね。
もちろん、タプルの要素数と変数の数が同じであればいくつでも同時に変数の値を代入することが出来るので、とても便利ですよね。

アンパックの応用例(変数入れ替え作業の簡易化)

実はアンパックを利用すると、変数の値を入れ替えるといった作業を簡単に行うことが出来ます。
それを説明するために、アンパックを利用せずに変数の値を入れ替えていきたいと思います。

<input>(アンパックを利用しない場合の変数の値入れ替え)

a = 10
b = 20

tmp = a
a = b
b = tmp

print(a, b)

実は、このように2つの変数を入れ替えるといった作業でも3行のコードを書かなくてはなりません。
何をやっているかを軽く以下で説明します。

①何も入っていない変数tmpにaの値を入れる
②変数aにbの値を入れる
③変数bにtmpの値を入れる

こんな感じです。
では、この作業をアンパックを用いて簡単にしていきましょう。

<input>(アンパックを利用した場合の変数の値入れ替え)

a = 10
b = 20

a, b = (b, a)

print(a, b)

アンパックを利用することで、先ほどは3行かかっていた部分が1行になりましたね。

このような形で、少しコードが嵩張る変数の値を入れ替える処理も1行で簡単に書くことが出来ます。

 タプルの様々なメソッド

ここからは、以下の順番でタプルのメソッドを一部紹介していこうと思います。

  • index:指定の要素を探す
  • count:指定の要素の数を数える

index:指定の要素を探す

<input>

tuple = (2, 4, 14, 7, 1, 8, 2)

print(tuple.index(2))
print(tuple.index(2, 2))

<output>

0
6

index()は、指定の要素がタプルの何番目に入っているのかを調べるためのメソッドです。
上記コードの『print(tuple.index(2))』ではタプルの中から2という要素を探して何番目に入っているのかを出力しています。

しかし、これのみだと今回の例のように同じ要素が二つ以上入っていた場合に見つけることが出来ません。
例えば、『2』という数字であればタプルの0番目と6番目に入っていますよね。

これを解決するために、第二引数を指定してあげます。
今回のコードの『print(tuple.index(2, 2))』という部分です。

第二引数では、要素探索のスタート地点を指定しています。
つまりこのコードだと、『2番目の要素以降から2を探す』といった命令になります。
なので6番目の2がコンピュータによって見つけられているといった感じですね。

count:指定の要素の数を数える

<input>

tuple = (2, 4, 14, 7, 1, 8, 2)

print(tuple.count(2))

<output>

2

count()は名前の通り、指定した要素を数えるためのメソッドです。
今回は『2』を指定しているので、2の数が出力されています。

 まとめ

今回は、タプルについてその使い方やアンパックのやり方まで紹介してきたのですがいかがだったでしょうか。

タプルは、リストと同様に複数のデータを扱う際によく使用され、特にタプルの性質上変更を行わないデータに対して使用することが多いです。

本記事を通して皆様の理解が少しでも深まっていれば幸いです。

また、リストと非常に似通っているタプルですが、実は大きく性質が異なるため使用する場面が違います。
その説明は以下の記事で行っているので、興味がある方は是非ご覧ください。

-Phython
-, ,