Python: tupleについての備忘録1

Python

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

次回に続きます。

コメント

タイトルとURLをコピーしました