タプル(tuple)の基礎知識 – Python3 入門 マニュアル

このページではPython3のタプル(tuple)についての基礎知識から実用的な使い方まで、Python3のタプル操作に必要な知識をまとめています。

タプルの生成と要素の取得

タプルの生成

タプルの生成は丸括弧 ( )を使い、要素をコンマ区切りで記述します。「要素が1個のタプル」は定義の仕方が異なるので、後述の要素が1個のタプル生成を参照ください。

 

文字列と数値のように異なる型の要素を混在することも可能です。タプルの中にリストやタプルを入れることも可能です。

 

要素が1個のタプル生成(重要)

要素が1個だけのタプル(単要素のタプル)を生成する場合は、必ず要素の後にコンマ( , )をつける必要があります。最後にコンマをつけないとタプルとしてではなく、下記のように文字列や数値として生成されてしまいます。

 

丸括弧なしタプル(重要)

タプル生成の丸括弧は省略可能です。下記のように要素をコンマで区切るとタプルが生成されます。

数値や文字列の変数として定義したつもりでも、文末にコンマが混入するとタプルになってしまいます。予期せぬバグに注意しましょう。

 

要素の取得

タプルの要素を取得する方法はリストと同じです。

要素はインデックスを指定して取得します。インデックスは 0 から始まります。インデックスにマイナスの値を指定すると、終端からn個目の要素を取得します。

 

複数要素の取得(スライス)

[ 開始位置 : 終了位置 ] によりタプルの一部を取得できます。
 

[ 開始位置 : 終了位置 : ステップ数] によりステップ数を指定してスライスすることもできます。
 

要素数を取得

組み込み関数 len() によりタプルの要素数を取得できます。

 

要素の追加・変更・削除

タプルは生成後に要素の変更が一切できません(イミュータブル)。追加・変更(置換)・削除はすべてエラーになります。

 

タプルはこのように要素の不変性を保証します。そのため固定の設定値、他のプログラミング言語の「定数の代用」として用いられます。
※多くのプログラミング言語には定数(値の変えられない変数)が存在しますが、Python には他の言語でいう「定数」はありません。

 

よくある誤解

タプルはイミュータブルで生成後の要素変更は一切できません。しかし、タプル変数自体の変更(再代入)、削除、結合は問題なく行うことができます。

 

タプルの落とし穴

この項は「重箱の隅をつつく」以外の何者でもありません。Python 初心者の方は混乱の原因になる可能性があるので、スキップしてください。

「タプルはイミュータブルで生成後の要素変更は一切できない」のですが、実は変更できてしまうケースがあります。下記のようにタプルの要素にリストや辞書がある場合、そのリストや辞書の内容を書き換えることができます。これにより間接的にタプルの要素が変更されてしまいます。

 

要素を含むかの判定・検索

in 演算子を使用することで、タプルに要素が含まれるかを判定できます。

 

存在の判定だけでなく検索結果のインデックスを取得したい場合は tuple.index() メソッドを使用します。ただし tuple.index() メソッドは list.index() メソッドと同じく、取り扱いに注意が必要です。

list.index(x[, start[, end]])
リスト中で、値 x を持つ最初の要素の位置をゼロから始まる添字で返します。 該当する要素がなければ、ValueError を送出します。docs.python.jp より引用

該当する要素が複数ある場合には最初のインデックスを返すこと、該当する要素がない場合には ValueError になることに注意しましょう。ValueError でプログラムが止まらないようにするには例外処理(try … except … )が必要になります。

 

タプル演算子 – 結合など

変数aと変数bを以下とします。
a = (1, 2, 3)
b = (1, 3, 5, 7, 9)

演算子 説明とサンプル
+ リストを結合します。

print(a + b) # (1, 2, 3, 1, 3, 5, 7, 9)

*  リストをn回結合します。

print(a * 2) # (1, 2, 3, 1, 2, 3)
print(a * 3) # (1, 2, 3, 1, 2, 3, 1, 2, 3)

in  リストに要素が含まれるかを判定します。含むならTrue、含まないならFalseを返します。

print(2 in a) # True
print(10 in a) # False
print(‘str’ in a) # False

not in  in の逆、つまりリストに要素が含まないかを判定します。含むならFalse、含まないならTrueを返します。

print(2 not in a) # False
print(10 not in a) # True
print(‘str’ not in a) # True

[i]  0 から数えて i 番目の要素を取得します。

print(a[0]) # 1
print(a[1]) # 2

[i:j] i から j までのスライス。複数要素の取得(スライス)を参照。

print(b[1:4]) # (3, 5, 7)

[i:j:k]  i から j まで、 k 毎のスライス。複数要素の取得(スライス)を参照。

print(b[0:5:2]) # (1, 5, 9)

 

タプルのループ処理(for ループ)

タプルのループ処理には for 文を使います。

 

要素番号(インデックス)をあわせて取得したい場合は、組み込み関数 enumerate() を使います。

 

タプルとリストの変換

タプルとリストは変換可能です。

タプルをリストに変換するには組み込み関数 list() を使用します。

 

リストをタプルに変換するには組み込み関数 tuple() を使用します。

 

タプルによる変数の同時代入(アンパック)

タプルを使うことで下記のように複数の変数に同時代入することができます。

 

タプルを複数変数に展開することをアンパックまたはアンパッキングと呼びます。丸括弧を省略したアンパッキングは、直感的で可読性にも優れるため多用されます。覚えておきましょう。

アンパッキングによる変数の交換

アンパッキングは変数の交換(入れ替え)としても使われることがあります。