タプル (tuple型オブジェクト)

タプル (tuple型オブジェクト)

タプルの定義と基本操作

 タプルリスト と同じくシーケンスに分類される組み込みデータ型です。
 複数の要素をもち、各要素にインデックスが割り当てられるという点でリストによく似たはたらきをしますが、タプルは immutable(変更不可)なオブジェクトです。リストとは異なり、タプルは一度定義すると、要素の変更・追加・削除が一切できない という特徴があります。

タプルの定義

 タプルを定義するときは要素を ( ) で囲みます。

 (要素1, 要素2, ... )

 各要素には左から順に 0, 1, 2, ... というようにインデックスが割り当てられます。
 タプルの要素が 1 つだけのときは

 (要素1,)

のようにカンマ (,) を添えます。カンマがないと、Python は ( ) を数値演算の優先度を決める括弧だと判断してしまうからです。

 リストが「身長を並べる」「日毎の平均気温を並べる」というように同種データの管理に用いられることが多いですが、タプルは主に「住所, 氏名, 年齢」といった、性質の異なるデータの管理に向いています。以下のサンプルコードでは「惑星名、赤道半径 [km]、密度 [g/cm3]」という 3 種のデータが入ったタプルを定義してみます。

# リストTUP_01-1

# (惑星名, 赤道半径[km], 密度[g/cm^3])
mercury = ("水星", 2440, 5.43)

print(mercury)
('水星', 2440, 5.43)

 先ほど、タプルは変更・追加・削除ができないと説明しました。
 del 文を使って要素を削除を試みます。

# リストTUP_01-2

# 1 番目の要素の削除を試みます
del mercury[0]
TypeError
 Traceback (most recent call last)
 <ipython-input-2-ce9d69f90e37> in ()
       3 
       4 # 1 番目の要素の削除を試みます
 ----> 5 del mercury[0]

 TypeError: 'tuple' object doesn't support item deletion

 エラーが出ました。エラーメッセージの最後の行で、
「タプル型オブジェクトは要素の削除をサポートしていません」
と警告されています。
 

タプルから値を取り出します

 タプルから値を取り出すときには次のように記述します。

 tuple[インデックス]

 金星のタプルを定義して、その赤道半径を取り出してみます。

# リストTUP_01-3

# (惑星名, 赤道半径[km], 密度[g/cm^3])
venus = ("金星", 6052, 5.24)

# 金星の赤道半径を取り出します
print(venus[1])
6052

 

タプルを連結します

 算術演算子「 + 」や複合演算子「 += 」を使ってタプル同士を連結できます。
 次のコードで火星のデータに公転周期 (年) と衛星数のデータを追加してみます。

# リストTUP_02

# (惑星名, 赤道半径[km], 密度[g/cm^3])
mars = ("火星", 3397, 3.93)

# 公転周期(年)と衛星数のデータを追加します
mars += (1.881, 2)

print(mars)
('火星', 3397, 3.93, 1.881, 2)

 タプルの要素の変更・追加・削除は認められていないのに、上のコードではタプルに要素が追加されているように見えます。実はこのあたりに誤解が多いのですが、タプル自体は変更できなくても、タプルを入れた変数自体は変えることができるのです(当たり前です。変数なのですから。それができなかったら大変困ってしまいます)。つまり上のコードでは、mars という変数に別のタプルを入れ直しているに過ぎません。「タプルそのもの」と、「タプルを入れた変数」を混同しないように注意してください。
 

タプルの要素を検索します

 in 演算子を用いると、タプルに特定の要素が存在しているかどうかを調べることができます。存在していたら True, 存在しなかったら False を返します。

# リストTUP_03

# (惑星名, 赤道半径[km], 密度[g/cm^3])
earth = ("地球", 6378, 5.52)

print("地球" in earth)
True

 

タプルの要素を変数に代入します

 一行の記述でタプルの要素を複数の変数に入れることができます。

# リストTUP_04

xyz = (10, 20, 30)

# 変数 x, y, z にタプルの要素を代入
x, y, z = xyz

# 変数 x, y, z を表示
print(x, y, z)
10 20 30

 

タプルの切り出し(スライス)

 指定した位置でタプルを切り出して新しいタプルを生成することができます。

 tuple[開始インデックス : 終了インデックス + 1]

 以下のサンプルコードを参考にしてください。

# リストTUP_05-1

# 惑星名をタプルを定義
planets = ("水星", "金星", "地球", "火星", "木星", "土星", "天王星", "海王星")

# インデックス 1 から 4 まで切り出す
x = planets[1:5]
print(x)
('金星', '地球', '火星', '木星')

 

# リストTUP_05-2

# インデックス 2 以降をすべて切り出す
x = planets[2::]
print(x)
('地球', '火星', '木星', '土星', '天王星', '海王星')

 

# リストTUP_05-3

# インデックス 2 から 1 文字飛ばしで切り出す
x = planets[3::2]
print(x)
('火星', '土星', '海王星')

 

タプルはディクショナリや set の要素となれます

 タプルは immutable(変更不能)なオブジェクトなので、ディクショナリ のキーや set の要素になることができます。

 例として太陽系外惑星 (Extrasolar planet) のディクショナリを作成してみましょう。
 単一星(連星系でない恒星)に惑星が発見されたときには、恒星名の後に恒星からの距離順に b, c, d, e, f, ... というアルファベットを付すという決まりごとがあります。たとえばアンドロメダ座 υ(ウプシロン)星は初めて発見された複数の惑星をもつ恒星系ですが、υ 星に近い方から b, c, d が割り当てられて、それぞれ Saffar, Samh, Majriti という名前がついています。アンドロメダ座 υ d と書けば、Majriti を指すことになります。以下のサンプルでは (恒星, アルファベット) というタプルをキーとして、惑星名を取り出せるようにしています:

# リストTUP_06

#太陽系外惑星のディクショナリ

eplanets = {("アンドロメダ座υ","b"):"Saffar",\
            ("アンドロメダ座υ","c"):"Samh",\
            ("アンドロメダ座υ","d"):"Majriti",\
            ("さいだん座ν","b"):"Quijote",\
            ("さいだん座ν","c"):"Dulcinea",\
            ("さいだん座ν","d"):"Rocinante",\
            ("さいだん座ν","e"):"Sancho",\
            ("かに座ν","b"):"Galileo",\
            ("かに座ν","c"):"Brahe",\
            ("かに座ν","d"):"Lipperhey",\
            ("かに座ν","e"):"Janssen",\
            ("かに座ν","f"):"Harriot"}

x = eplanets[("かに座ν","d")]
print(x)
'Lipperhey'