データにはさまざまな種類があり、1つのデータに複数のデータで構成されているものもあります。
タプル
pythonでは、複数のデータの組み合わせから構成されているデータを「タプル(tuple)」という種類のオブジェクトですることがあります。
タプルは「組」とも呼ばれ、複数の要素が決まった順番に並んでいる値のことを指します。
タプルの書き方
タプルオブジェクトは、複数の値を’,'(カンマ)で区切って記述します。
下記のコードはタプルの例です。
# 京都市役所の緯度・経度 pos = 35.011333723326274, 135.76810060581332 # 情報を表示する print(pos)
こちらは、変数に値を代入するときに’,'(カンマ)で区切ったデータを入れているだけですが、これがタプルオブジェクトとなります。
実行した結果は下記のようになります。
(35.011333723326274, 135.76810060581332)
上記のコードでもタプルとしては機能しますが、コードを見たときには分かりづらいので通常はこのデータを括弧で括ります
# 京都市役所の緯度・経度 pos = (35.011333723326274, 135.76810060581332) # <-- データを括弧で括っておく # 情報を表示する print(pos)
タプルの参照
タプルに登録したオブジェクトは、リストオブジェクトと同じように、「タプルオブジェクト[要素の順番(インデックス)]」でアクセスします。
タプルオブジェクト[インデックス]
先ほどのコードでデータを個別に参照するには、下記のようなコードで可能です。
# 京都市役所の緯度・経度 pos = (35.011333723326274, 135.76810060581332) # 情報を表示する print("緯度は ", pos[0], " で") print("経度は ", pos[1], " です")
このコードを実行すると、下記のように出力されます。
緯度は 35.011333723326274 で 経度は 135.76810060581332 です
タプルの比較
タプルは比較演算子を使って比較することができます。
==(等値)演算子は、タプルの要素がすべて同じ時にTrueを返します。
# 京都市役所の緯度・経度 si_pos = (35.011333723326274, 135.76810060581332) # 京都府庁の緯度・経度 fu_pos = (35.02135090105738, 135.75513924774188) pos = (35.011333723326274, 135.76810060581332) # 結果を表示する print("比較結果は ", si_pos == pos, " です")
このタプル変数’pos’には京都市役所の緯度・経度と同じ値を入れています。このコードを実行すると、下記のような出力になります。
比較結果は True です
ちなみに、上記のコードで pos の値を下記のように変更(緯度の最小位の4だけ削りました)して、実行してみると
#pos = (35.011333723326274, 135.76810060581332) pos = (35.01133372332627, 135.76810060581332)
実行結果は、
比較結果は False です
となります。
!=(非等値)演算子は、タプル要素に異なるものがある場合はTrue、まったく同じ場合はFalseを返します(等値演算子と逆の結果となります)。
先ほど値を少し変更したコードの比較を!=に変えて実行してみます。
# 京都市役所の緯度・経度 si_pos = (35.011333723326274, 135.76810060581332) # 京都府庁の緯度・経度 fu_pos = (35.02135090105738, 135.75513924774188) #pos = (35.011333723326274, 135.76810060581332) pos = (35.01133372332627, 135.76810060581332) # 結果を表示する print("比較結果は ", si_pos != pos, " です") # <-- 等値演算子を非等値演算子に変更
実行すると、出力は下記のようになります。
比較結果は True です
タプルでは比較演算子での大小比較も可能です。
大小比較では、同じインデックスの値の比較を行い、相違があればそこで判定を終了し、同じであれば次の要素をチェックします。
同じインデックスまで値がすべて同じで要素数が異なる場合、要素が多いほうが「大きい」と判定されます。
大小比較の例1
dat1 = (1,2,3) dat2 = (1,2,3,4) print("比較結果は ", dat1 > dat2, " でした")
この場合、dat1 と dat2 の同じインデックスの値がすべて同じですが、dat2は要素数が1つ多いので「dat2 は dat1 より大きい」となるため、dat1 > dat2 の結果はFalseとなります。
大小比較の例2
dat1 = (1.1,2,3) dat2 = (1,2,3,4) print("比較結果は ", dat1 > dat2, " でした")
こちらはコードが多少読みづらいですが、dat1の先頭の要素の値は’1.1’です。
こちらを実行すると先頭の要素を比較したときにdat1[0]の値が1.1、dat2[0]の値が1なので「dat1はdat2より大きい」となり、dat1 > dat2 の結果はTrueとなります。
タプルオブジェクトの操作
リストオブジェクトは、要素の参照以外に追加や削除、変更などを行うことができます。
タプルオブジェクトは、リストオブジェクトのように要素の追加や削除、要素の変更などはできません。
タプルオブジェクトで要素の変更を行う場合は、部分的(要素)の変更ではなく、タプルオブジェクトそのものを作り直すことになります。
下記のような実装にするとエラーとなってしまいます。
color = (255,255,0) # 黄色 # 白にしたい場合は、3番目の要素の値を255にすればよいだけ # でも下記のようにするとエラーとなります color[2] = 255 # 3番目(インデックスは2)の値を255にする
エラーメッセージは下記のようなものになります。
TypeError: 'tuple' object does not support item assignment
メッセージの内容は、「’タプル’オブジェクトはアイテムの割り当てをサポートしていません」です。
正しくは、下記のようなコードになります。
color = (255,255,0) # 黄色 # 白にしたい場合は、3番目の要素の値を255にすればよいだけ # でも下記のようにするとエラーとなります #color[2] = 255 # 3番目(インデックスは2)の値を255にする color = (255,255,255) # 白色
こうするとタプル変数 color の値を(255,255,255)[白色]にすることができます。
タプルとリストの違い
タプルとリストは、「複数のデータの集合」でよく似ています。
記述の方法も、タプルは「なし、もしくは丸括弧()」でリストは「角括弧」の違いくらいです。
ただ、前述のとおりタプルは要素の追加や変更などはできません。
data_list = [1, 2, 3, 4] data_tuple = (1, 2, 3, 4)
リストは、「不定個数の独立したデータを集約して扱う」ためのもので、
タプルは、「規則性を持った複数のデータの集合を扱う」ためのものです。
タプルは、C言語で言うところの構造体のようなものだと考えると分かりやすいかもしれません。
C言語の構造体はメンバに名前をつけますが、タプルはメンバに名前はないですがその順番には決まりがあります。