PythonにはNumpyやpandasなど、大きなデータを計算する際に便利なライブラリもあるが、Python組み込みのデータ操作を理解しておかないと、これらのライブラリをうまく使いこなすことはできない。

この記事ではPythonに標準組み込みされているデータ構造のうち、タプルについて紹介しよう。

タプルの定義

タプルの変数定義は、カンマ区切りで値を代入する。

t = 4, 5, 6
t # (4, 5, 6)

また、二次元のタプルを作ることも可能だ。
ネストを深くすることで、多次元タプルも作ることができる。

nested_t = (4, 5, 6), (7, 8, 9)
nested_t # ((4, 5, 6), (7, 8, 9))

タプルの特徴として、オブジェクト自身を再定義することはできるが、タプルの要素を編集・削除することはできないということが大きく挙げられる。

配列(リスト)の定数版とイメージすれば分かりやすいだろう。

t = 4, 5, 6

# オブジェクトの再定義は成功する
t = 1, 2, 3

# 要素の変更はできない
t[1] = 1

しかしタプル内のオブジェクトがリストのように変更可能なものであれば、下記のとおり要素を再定義することができる。

t = 4, [1, 2, 3], 5
t[1][1] = 5
t # (4, [1, 5, 3], 5)

# これはエラーになる
t[1] = 5

オブジェクトをタプルに変換

配列や文字列をタプルに変換する。

組み込みのtuple関数の引数にオブジェクトを渡すことで、タプルに変換することができる。

t1 = tuple([4, 5, 6])
t1 # (4, 5, 6)

t2 = tuple('string')
t2 # ('s', 't', 'r', 'i', 'n', 'g')

タプルの参照

タプルの要素を参照する場合は角括弧内にインデックスを指定する。

この辺りの操作はリストと同様だ。

t1 = tuple('string')
t1[1] # 't'

t2 = (1, 2, 3), (4, 5, 6)
t2[1][0] # 4

タプルに要素を追加

+演算子でタプル同士を連結することもできる。

t1 = (1, 2)
t2 = (3, 4)
t3 = t1 + t2
t3 # (1, 2, 3, 4)

また、*演算子で整数を掛けることにより、タプルのコピーを連結することもできる。

t = (1, 2, 3)
t * 3 # (1, 2, 3, 1, 2, 3, 1, 2, 3)

タプルの分解

すでに定義されているタプルを変数に分解することもできる。

t = (4, 5, 6)
a, b, c = t
c # 6

この分解機能を応用すると、変数を下記のように簡単に入れ替えることができるのだ。

a, b = 1, 2
a # 1
b # 2

b, a = a, b
a # 2
b # 1

同様の処理を他の言語、例えばPHPなどでやる場合は下記のような手順を踏むだろう。

$tmp = $a;
$a = $b;
$b = $tmp;

Pythonではより簡単に変数の入れ替えができるので、独特ではあるが便利な機能だ。

また、タプルの分解の際、最初のいくつかの要素だけを抜き出したい時もあるだろう。
その場合は以下のように少し特殊な文法を使うことになる。

val = 1, 2, 3, 4, 5
a, b, *_ = val

a # 1
b # 2
_ # [3, 4, 5]

慣例として不要な変数には、_(アンダースコア)を変数名にすることが多いらしい。

タプルのたった二つのメソッド

タプルのメソッドは二つしか用意されていない。

indexメソッド

引数に検索したいオブジェクトを指定する。
タプル内に指定したオブジェクトが見つかれば、インデックス番号(タプル内の位置)を返す。
見つからない場合はエラーが返る。

t = 4, 5, 6
t.index(5) # 1

countメソッド

引数に指定したオブジェクトがタプル内にいくつ存在するかを調べるときに使う。
下記の例の場合、引数に5を指定している。
タプル内に存在する5の数を調べ結果として返すメソッドだ。

t = 4, 5, 6, 5, 7, 4, 8, 9, 5
t.count(5) # 3

タプルの使い道

要素の変更や削除ができないなど、色々と制限の多いタプルだが、定数を配列化するような場合などに使うことが多い。

アカウントのIDやAPIのキーなど、プログラムの中で固定化された値が良い例だ。
このような値を通常の変数やリストとして定義すると、何かの拍子に値が書き換えられバグを起こしてしまうかもしれない。
複数人でプログラムを共有して編集する場合などには特に注意が必要だ。

タプルとして定義しておけば、その後のコードで中身を書き換えられる心配がないので、こういった場合にリストよりも優先してタプルを使う必要が出てくるのだ。