Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

pythonのタプル

pythonのタプルについて

・シーケンス型の1つ。
・リストと似ているが、タプルはcount, index以外のメソッドがない。
・リストは[]、タプルは()または括弧なし。
・immutableな型で、値の変更ができない。
・要素を変更できない。ソートもできない。
・indexとsliceはは使用できる。
・異種データが混じるときはcollectionsライブラリのnamedtupleも選択肢に。
・値を変更しないとき、変更したくないとき、関数の引数にするときによく使う。
・def fun(*args)として、関数のparameterにtupleとして、いくつでも受け取れる。
・内包表記がない。
・要素数 len()関数

○タプルの作成

t1 = (1, 2) #tupleのリテラルは()で。
print(t1)   #(1, 2)

t2 = 3, 4   #かっこなしでもtupleになる
print(t2)   #(3, 4)

t3 = 0,    #要素が1個のときは最後にカンマ
print(t3)  #(0,)

t4 = (2017, ),  #2次元tupleになる
print(t4)       #((2017,),)

t5 = tuple([7, 8])  #tuple(iterable) tuple関数
print(t5)           #(7, 8)

t6 = tuple("abc")
print(t6)           #('a', 'b', 'c')

 
・置換、再代入できない。スライスやindexでの参照はできる。

t = (3, 4, 5)
print(t[0])       #3
print(t[0:2])     #(3, 4)
#t[0] = 10        #TypeError: 'tuple' object does not support item assignment

t = (10,) + t[1:] #要素を変更する場合は新たに作り直すことになる。
print(t)          #(10, 4, 5)

list1 = list(t)   #リスト化→代入→再タプル化も可能
list1[0] = 20
t = tuple(list1)
print(t)          #(20, 4, 5)

 
・同時代入、アンパック

x = 0
y = 0
r = 5
print(x, y, r)    #0 0 5
x, y, r = 3, 4, 5 #x, y, rに同時代入
print(x, y, r)    #3 4 5
x, y = y, x       #x, yの入れ替え
print(x, y, r)    #4 3 5

data = ("math", 100)
sub, point = data   #dataをsubとpointにアンパック
print(point)        #100

 
・大小関係 まず[0]要素で比較、同じなら[1]要素で比較。

print((3, 5) > (2, 8))  #True
print((3, 2) > (1, 6))  #True
print((1, 2) > (1, 2))  #False
print((1, 2) > (1, 0))  #True
#print((1, 2) > ("", 1))#TypeError: unorderable types: int() > str()

 
・連結 +
・繰り返し *

t1 = (1, 2)
t2 = (10, 20)
print(t1 + t2)    #(1, 2, 10, 20)
print(t1 * 3)     #(1, 2, 1, 2, 1, 2)

 
・文字列タプルからの文字取出し

t = ("abc", "def")
print(t[1])        #def
print(t[1][0])     #d

 
・zip()関数 複数のシーケンスから要素の少ないほうに合わせてタプルを作る。
 ただし、イテラブルなzipオブジェクトが作られ、list関数やtuple関数で実体化。
 あるいはイテレータとしてfor文などで使う。

list1 = ("a", "b")
list2 = (1, 2, 3, 4, 5)
z = zip(list1, list2)
print(z)                       #<zip object at 0x~>
for i in z:
    print(i)                   #('a', 1)    ('b', 2)
t =tuple(zip(list1, list2))
print(t)                       #(('a', 1), ('b', 2))
l = list(zip(list1, list2))
print(l)                       #[('a', 1), ('b', 2)]