tupleとは
一言で言うとimmutableなlist。
即ち中身を変える事のできない、その中身は参照したり別のデータの材料にするだけのデータ型。
tupleの作り方
カンマ区切りのデータなら括弧の有無に関わらずtupleになる。
この場合、str一文字だと、ただ変数にstr型データを代入しただけになってしまう。
しかし、その一文字の後にカンマ”,”を追加する事で「tupleを作るんだよ」、という事がPython にも伝わり要素1つのtuple型データが出来る。
また、strやlist等のiterableなデータを引数(argument)にしてbuilt-inのtuple()で作る事もできる。
>>> tpl = () # 括弧で空のtuple >>> type(tpl) <class 'tuple'> # カンマ区切りのデータ(括弧有り) >>> tpl2 = (1, 2, 3) >>> tpl2 (1, 2, 3) # カンマ区切りのデータ(括弧なし) >>> tpl3 = 1, 2, 3 >>> tpl3 (1, 2, 3) # カンマで区切らないとSyntaxErrorを返す >>> tpl2 = (1 2 3) File "<stdin>", line 1 tpl2 = (1 2 3) ^ SyntaxError: invalid syntax >>> tpl2 = 1 2 3 File "<stdin>", line 1 tpl2 = 1 2 3 ^ SyntaxError: invalid syntax # built-inのtuple()で作っても良い。その場合、引数(argument)はiterableなデータ一つ >>> tpl4 = tuple([1, 2, 3]) # list [1, 2, 3]をargumentにすると各要素がtupleの要素に >>> tpl4 (1, 2, 3) # argumentにstrを取っても良い。strはiterable >>> tpl5 = tuple('123') >>> tpl5 ('1', '2', '3') # int型データはiterableじゃないので、argumentに取れない >>> tpl5 = tuple(12345) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable # 要素が一つのtupleを作る場合、tuple()使用ならそのままで良いが、使用しない場合はカンマを最後に付ける # tuple()使用 >>> tpl6 = tuple("1") >>> tpl6 ('1',) # tuple()を使用しない場合、"1"の後にカンマ","を付けるとtuple型になる >>> tpl7 = "1", >>> tpl7 ('1',) # カンマを後につけないと、str型"1"を変数tpl7に入れただけになる >>> tpl7 = "1" >>> tpl7 '1'
括弧なしでもカンマで区切る事でtupleになる点と、1つの要素だけで作るtupleの作法は覚えて置きたい。
Immutable:不可変
tupleはImmutableなデータ。
どういう事かというと、一度作られるとその作られた要素は変わらない。
要素は不可変
>>> tpl1 (1, 2, 3) >>> tpl2 (1, 2, 3) # 要素を変えようとしても、一度できた要素を上書き(= その要素を別のデータでassignする事)が出来ない >>> tpl1[0] = 6 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
出来るのはデータからの新規作成
>>> tpl1 (1, 2, 3) >>> tpl2 (1, 2, 3) >>> id(tpl1) 4523178816 >>> id(tpl2) 4523184320 >>> tpl1 += tpl2 >>> tpl1 (1, 2, 3, 1, 2, 3) >>> id(tpl1) 4521893024
変数tpl1に変数tpl2を+=で追加した新しい変数tpl1、(1, 2, 3, 1, 2, 3)を作った上記において、新しい変数tpl1のidが元の変数tpl1のidと異なっている。
これはtuple型はImmutableなので、変数tpl1は元のtuple(1, 2, 3)ではなく、新しく作られた(1, 2, 3, 1, 2, 3)を参照しているから起きている事。
メソッド:選ぶか数えるか
メソッドは基本的にcount とindexの2つ。
>>> dir(tpl1) ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
要素の数を数えるcountと、最初の位置を返すindex。
>>> tpl1 (1, 2, 3, 1, 2, 3) # countはその要素数を返す >>> tpl1.count(1) 2 # 1は二つ # 聞かれた要素がなければ0(個)を返す >>> tpl1.count(4) 0 # indexは第2引数、第3引数の間にある、求める要素の位置を返す # 複数要素がある場合には1つ目の位置を返し、 # 第2第3引数が与えられなければ最初から最後までが探索対象 (2022/6/2 修正) >>> tpl1.index(1) 0 # 無い要素の場所を聞くと、ValueErrorを返す >>> tpl1.index(4) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: tuple.index(x): x not in tuple
メソッド:index追記(2022/6/2)
上記で「indexはその要素の位置(複数ある場合は最初の位置)を返す」と当初書いたが、正確に言うと
「indexは第2引数、第3引数の間にある、求める要素の位置を返す。複数要素がある場合には1つ目の位置を返し、第2第3引数が与えられなければ最初から最後までが探索対象」
になる。
>>> tpl1 = (1, 2, 3, 1, 2, 3, 1, 2, 3) >>> tpl1.index(2, 3) # index3の要素 = 前から2つ目の"1" 以降の"2"のindexを返す 4 # = 2つ目の"2"のindex >>> tpl1.index(2, 5, 8) # index5の要素 = 前から2つ目の"3" から index8の要素 = 最後の"3"の間の"2"のindexを返す 7
次回に続きます。
コメント