Pythonを使っていると、エラーがでたときにタプル(tuple)という専門用語を見かけることがあります。
タプルは型の一つで、数値などの指定時にある条件が揃うとタプル型として認識されます。
タプルとは何か?どういう条件でタプルになるのかを知って、いつの間にかタプルになっていた、、、を防ぐ方法について解説しています。
タプルとは何か?配列との違い
タプルとは、pythonの型の一つです。型とは、listやint, strなどのことです。
タプル型は、順番に並んだ複数の要素を1まとまりとしてみなしたものです、配列と似ていますが、特性が異なります。
配列と異なる主な点は以下の3つです。
このように、変更を加えることができないことを「イミュータブル( immutable)」と言います。
イミュータブル( immutable)とは?ミュータブル(mutable)との違い
もう少しだけ補足すると、イミュータブルは「非破壊」という意味で、元の変数を変更できない、すなわち破壊できないことを指します。
それとは逆に、list型(配列)など、大本の変数自体を変更できるものをミュータブル(破壊可能)といいます。
タプルを使うメリット
意図しないうちにタプルになってしまうとイラっとすることがありますが、タプル自体にはもちろんメリットがあり、そのために存在しています。
タプルは、外部から変更できないので、第三者など誰かしらが変更してしまうリスクを排除できます。また、変更できない(一つのidに対して一意)なのでlist型と比較して処理速度が速いというメリットがあります。
タプルの作り方
タプルの作り方は大きく3つあります。
とくに、1と2は、何気なくやってしまうといつのまにかtuple型になっている、、ということが発生します。
それぞれについて実例を用いて解説していきます。
カンマ「,」 で区切り変数に代入する(カッコなし)
タプルの作成条件は、カッコ( ) なしでカンマ「,」で区切ることです。
この指定方法にすれば、数値、文字列、変数のいずれもが、タプル型になります。
以下は、数値、文字列、変数でtupleを作った実例です。type関数で、作成した変数の型を調べて出力しています。
a = 1,2,3,4,5
type(a)
#出力:tuple
b = 'AAA', 'BBB', 'CCC',
type(b)
#出力:tuple
A = 'AAA'
B = 'BBB'
C = 'CCC'
d = A, B, C,
type(d)
#出力:tuple
値が一つでカンマがない場合はタプルにならない
指定する値が1つでカンマがない場合はtupleになりません。
e = 1
type(e)
#出力:int
f = "A"
type(f)
#出力:str
g = 1,
type(g)
#出力:tuple
h = "A",
type(h)
#出力:tuple
値が1つでもカンマがあるとタプルになる
値が1つでもカンマがあるとタプルになります。
h = "A",
type(h)
#出力:tuple
カンマ「,」 で区切り変数に代入する(丸カッコあり)
丸カッコ ( ) の中でカンマを使って記述した場合もタプルになります。
数値、文字列、変数のいずれもがタプルになります。
a = (1,2,3,4,5)
type(a)
#出力:tuple
b = ('AAA', 'BBB', 'CCC')
type(b)
#出力:tuple
A = 'AAA'
B = 'BBB'
C = 'CCC'
d = (A, B, C)
type(d)
#出力:tuple
値が一つでカンマがない場合はタプルにならない
指定する値が1つでカンマがない場合はtupleになりません。
e = (1)
type(e)
#出力:int
f = ("A")
type(f)
#出力:str
値が1つでもカンマがあるとタプルになる
値が1つでもカンマがあるとタプルになります。
g = (1,)
type(g)
#出力:tuple
h = ("A",)
type(h)
#出力:tuple
tupleメソッドを使う
tupleメソッドを使えば、タプル型として生成することができます。
- 出力結果は、丸カッコつきで表示されます。
- 配列(list)をタプルに変換することができます。
- 渡す引数は1つ(※複数あるとエラーになる)
- 整数を渡すとエラーになります。
1文字(str)をタプルに変換
tuple("A")
#出力:('A',)
2文字以上の文字列(str)をタプルに変換
tuple("ABCD")
#出力:('A', 'B', 'C', 'D')
1文字づつ区切られて認識されます。
配列形式をタプルに変換
配列(list)をタプル型に変換することができます。
tuple([123])
#出力:(123,)
i = tuple([1,2,3,456,789])
type(i)
#出力:tuple
※注意点|エラーになるパターン
引数が数値の場合はエラーになります。
tuple(1)
#出力:「TypeError: 'int' object is not iterable」
iterable(イテラブル)というのは、for文などでひとつづつ取り出せる形式のことです。
引数が複数ある場合もエラーになります。
j = tuple(1,2,3,456,789)
type(j)
#出力:「TypeError: tuple expected at most 1 argument, got 5」
タプルにしないための条件
以上のことをしなければタプルは生成されません。気づいたらタプルになっていたということを防ぐために、タプルにしないための条件をまとめておきます。
[ ]
を使いlistであることを明示すれば、意図せずタプルになることを防げます。
「,」なしの1文字はtupleにならない。
▼int・カッコあり
e = (1)
type(e)
#出力:int
▼str・カッコあり
f = ("A")
type(f)
#出力:str
角カッコ[ ]で囲む(listになる)
▼[ ]で囲んだ複数の文字列
k = ["AAA","BBB","CCC"]
type(k)
#出力:list
▼[ ]で囲んだ数値1個
m = [1]
type(m)
#出力:list
▼[ ]で囲んだ複数の数値
n = [1,2,3,4,5,]
type(n)
#出力:list
タプルの値を指定する方法
実際にタプルを使う場合に、値の取得方法についての解説です。
・指定方法は配列(list)と同じ。
・1つ1つの要素はタプルではない。
なお、取り出した1つ1つの要素はタプル型でなく、int型 や str型 などになります。
a = (1, 2, 3, 4, 5)
a[1] #出力:「2」
type(a[1]) #出力:「int」
b = ('AAA','BBB','CCC')
b[2] #出力:「'CCC'」
type(b[2]) #出力:「str」
タプルでエラーが発生する条件
よく遭遇するタプルのエラーですが、その多くは、気づかないうちにタプル型になった変数に対して、タプルがサポートしていないメソッドを使っていることが多いです。
例えば、append, replaceメソッドなど配列では使えるのですが、タプルでは使うことができません。
a = (1, 2, 3, 4, 5)
a.append(6)
#出力:AttributeError: 'tuple' object has no attribute 'append'
▼配列(list)型になら問題なく使えます
a = [1, 2, 3, 4, 5]
a.append(6)
a
#出力:[1, 2, 3, 4, 5, 6]
タプルで使えるメソッド
タプル型に対して使えるメソッドは、countメソッドとindexメソッドの2つのみになります。
countメソッド
タプルの中に引数で指定した要素がいくつあるか数えます。
A.count(x)
└「A」タプル
└「x」数える要素
└ ※1文字の数ではないcount(数値)
a = (111,222,333,111,444,123,555,111,222,111)
a.count(111)
#出力:4
b = ("AAA","BBB","CCC","aaa","bbb","AAA",123, 456, "AAA")
b.count("AAA")
#出力:3
indexメソッド
・指定した要素が何番目か返す(0からカウント)
・複数ある場合は最初に若い番号を返す
A.index(x)
└「A」タプル
└「x」数える要素
└ インデックス番号を返すindex(数値)
a = (111,222,333,111,333)
a.index(333)
#出力:2
b = ("AAA","BBB","CCC","aaa",123, 456, "aaa")
b.index("aaa")
#出力:3
a = (111,222,333,111,333,111)
for i, aaa in enumerate(a):
if aaa==111:
print(i)
#出力:0 3 5
▼enumerate(A)
とは
- enumerate:Aの中の「要素」と、要素の「インデックス番号」を取り出せる関数
- Aにはlistやtupleが入る
- for文とセットで使う
- 新たな変数が2つ必要
- 「要素」を入れる変数
- 「インデックス番号」を入れる変数
▼enumerateの使い方for a, b in enumerate(A):
└「a」:インデックス番号を格納
└「b」:要素を格納
上の例では、要素が111だった場合に、インデックス番号を出力している。
まとめ
タプルは値を変更させたくない場合に制限をかける型です。基本的に、タプルじゃなきゃいけないという場面は少ないです。
不意のタプルを避けるためには、[ ]
をつけ、listであることを明示するようにすれば、エラーの中にtupleの文字が含まれることも少なくなるはずです。
(参考)Python公式サイト組み込み型