Pythonでタプルの要素を追加・変更・削除
Pythonのタプル(tuple
)はイミュータブル(更新不可)なシーケンスで、要素を変更したり削除したりすることはできない。
本来、タプルは更新したくない・されたくないデータを表現するものなので、更新する必要があるのならばタプルではなくリストを使うべきだが、どうしてもタプルを更新したい場合はリストに変換してから処理を行い、再度タプルに戻せばよい。
なお、便宜上、追加や変更などといった言葉を使っているが、実際は新たなオブジェクトを生成しており、元のオブジェクトを更新しているわけではない。
タプルはイミュータブル(更新不可)
以下のタプルを例とする。
t = (0, 1, 2)
print(t)
# (0, 1, 2)
print(type(t))
# <class 'tuple'>
リストなどと同様にインデックス[]
やスライス[:]
で要素を取得できる。
print(t[0])
# 0
print(t[:2])
# (0, 1)
イミュータブル(更新不可)なので、新たな値を代入することはできない。
# t[0] = 100
# TypeError: 'tuple' object does not support item assignment
リストにあるappend()
のような要素を追加したりする破壊的なメソッド(元のオブジェクトを変更するメソッド)も定義されていない。
# t.append(100)
# AttributeError: 'tuple' object has no attribute 'append'
複数のタプルを連結
タプルはイミュータブルだが、+
演算子で複数のタプルを連結することは可能。このとき、元のオブジェクトはそのままで、新たなオブジェクトが生成される。
t = (0, 1, 2)
t_add = t + (3, 4, 5)
print(t_add)
# (0, 1, 2, 3, 4, 5)
print(t)
# (0, 1, 2)
連結できるのはタプル同士のみ。リストなど他の型との連結はできない。
# print(t + [3, 4, 5])
# TypeError: can only concatenate tuple (not "list") to tuple
tuple()
でタプルに変換すれば連結可能。
print(t + tuple([3, 4, 5]))
# (0, 1, 2, 3, 4, 5)
tuple()
でタプルに変換できるのはリストなどのイテラブルオブジェクトのみ。整数int
や浮動小数点数float
などはエラーとなる。
# print(t + tuple(3))
# TypeError: 'int' object is not iterable
int
やfloat
などの値を追加したい場合は要素数1のタプルとして連結すればよい。
print(t + (3,))
# (0, 1, 2, 3)
要素数1のタプルは末尾にカンマが必要なので注意。
タプルに要素を追加・挿入
末尾や先頭に新たな要素を追加したい場合は上述の+
演算子による連結を使えばよいが、任意の位置に挿入したい場合は一度リストに変換する必要がある。
list()
でリストに変換。
t = (0, 1, 2)
l = list(t)
print(l)
# [0, 1, 2]
print(type(l))
# <class 'list'>
insert()
メソッドで要素を挿入。
l.insert(2, 100)
print(l)
# [0, 1, 100, 2]
tuple()
でタプルに変換。
t_insert = tuple(l)
print(t_insert)
# (0, 1, 100, 2)
print(type(t_insert))
# <class 'tuple'>
タプルの要素を変更
要素を変更する場合も流れは同じ。リストに変換して処理し、タプルに戻す。
t = (0, 1, 2)
l = list(t)
l[1] = 100
t_change = tuple(l)
print(t_change)
# (0, 100, 2)
タプルの要素を削除
要素の削除も同様。
t = (0, 1, 2)
l = list(t)
l.remove(1)
t_remove = tuple(l)
print(t_remove)
# (0, 2)
ここではremove()
メソッドを使っているが、pop()
やdel
を使うことも可能。