『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

タプルの使い方(抽出・連結・検索・スライス)

タプルの定義と基本操作

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

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

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

(要素1,)

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

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

# PYTHON_TUPLE

# In[1]

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

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

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

# In[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[インデックス]

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

# In[3]

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

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

タプルを連結する

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

# PYTHON_TUPLE_JOIN

# In[1]

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

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

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

タプルの要素の変更・追加・削除は認められていないのに、上のコードではタプルに要素が追加されているように見えます。実はこのあたりが大変ややこしいのですが、もとのタプル自体は変更せずにメモリにデータを残したまま、新しいタプルを生成して同じ変数に入れることはできます。こういうことができてしまうので、ミュータブルなオブジェクトもイミュータブルなオブジェクトも、表面上は同じような使い方ができます。

タプルの要素を検索する

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

# PYTHON_TUPLE_SEARCH

# In[1]

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

print("地球" in earth)
# True

タプルの各要素を変数に代入する

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

# PYTHON_TUPLE_ASSIGNING

# In[1]

xyz = (10, 20, 30)

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

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

タプルのスライス

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

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

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

# PYTHON_TUPLE_SLICING

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

# インデックス 1 から 4 まで切り出す
x = planets[1:5]

print(x)
# ('金星', '地球', '火星', '木星')


# In[2]

# インデックス 2 以降をすべて切り出す
x = planets[2::]

print(x)
# ('地球', '火星', '木星', '土星', '天王星', '海王星')


# In[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 を指すことになります。以下のサンプルでは (恒星, アルファベット) というタプルをキーとして、惑星名を取り出せるようにしています:

# PYTHON_TUPLE_DICTIONARY

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

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'

コメント