sec02 - tupleの編集とメソッド
スポンサーリンク

tupleの編集

tupleは要素を編集することができません。ですので、var[n] = dataのように要素番号を指定して値を上書きしようとしてもエラーになります。これは、スライスで範囲指定した場合も同じです。

+ 演算子

tupleは、+演算子で要素を結合することができます。+演算子の結合は、それぞれのtupleの要素を抽出して新しいtupleを生成します。ですので、元のtupleは編集されません。

文字列やlistの時と同じで、違うデータ型との演算はできません。必ずtuple同士で+演算子を使用します。

次のコードを実行して、挙動を確認しましょう。

sample_tuple = ('a', 'b', 'c')
new_tuple = sample_tuple + (1, 2, 3)
print(new_tuple)     # ('a', 'b', 'c', 1, 2, 3)
print(sample_tuple)  # ('a', 'b', 'c')  # 元のtupleは変わらない

上記コードは、変数"sample_tuple"の('a', 'b', 'c')(1, 2, 3)+演算子で結合し、新しいtupleを生成します。生成されたtupleは、変数"new_tuple"へ代入されています。

新しく生成されたtuple(('a', 'b', 'c', 1, 2, 3))には、元の2つのtupleの要素が順番に格納されます。尚、変数"sample_tuple"の中身は変わりません。

スポンサーリンク

* 演算子

*演算子を使用すると、元のtupleの要素を指定した回数だけ繰り返した新しいtupleを生成できます。これは文字列やlistの繰り返しと同じような挙動です。

次のコードを実行して、挙動を確認しましょう。

sample_tuple = ('a', 'b', 'c')
new_tuple = sample_tuple * 4
print(new_tuple)     # ('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')
print(sample_tuple)  # ('a', 'b', 'c')  # 元のtupleは変わらない

('a', 'b', 'c')の要素が4回繰り返された新しいtupleが生成され、変数"new_tuple"に代入されます。

tupleのメソッドの概要

tupleは要素を編集できないため、要素を編集するようなメソッドは用意されていません。

tupleに用意されているメソッドは、count()index()のみです。なお、この2つのメソッドの使い方はlistと同じです。

index()

index()メソッドは、指定した値と等しい要素を検索し、存在する場合は最初に見つかった要素番号を返します。もし、指定した値と等しい要素がtupleの中に存在しなかった場合はエラーになります。

記法は3種類あり、『検索する要素のみ引数に渡す場合』、『検索する要素とstartの位置を指定する場合』、『検索する要素とstart, endの位置を指定する場合』があります。

  • index(x)
    • tupleの全範囲からxと等しい値を検索する
  • index(x, start)
    • tuple[start:]の範囲からxと等しい値を検索する
  • index(x, start, end)
    • tuple[start:end]の範囲からxと等しい値を検索する

任意の引数である"start"と"end"はスライス記法として解釈され、tupleの探索範囲を指定できます。この時返される要素番号は、"start"からの相対位置ではなく、tuple全体の先頭からの位置になります。

まずは、"start"と"end"を指定しない場合のコードを確認してみましょう。

sample_tuple = ('a', 'b', 'c', 'a')
result = sample_tuple.index('b')
print(result)  # 1 (index() は要素の位置を返します。)

上記コードの実行結果は"1"になります。最初に見つかった'b'の要素番号を返します。

次に、"start"のみ指定した場合のコードを確認してみましょう。

sample_tuple = ('a', 'b', 'c', 'b')
result = sample_tuple.index('b', 2)
print(result)  # 3 (index() は要素の位置を返します。)

上記コードの場合は、sample_tuple[2:]の範囲で検索を行うため、最初の'b'([1])は検索の範囲外で、2番目の'b'([3])が検索に引っかかります。実行結果は"3"になります。

次に、"start"と"end"を指定する場合のコードを確認してみましょう。

sample_tuple = ('a', 'b', 'c', 'b')
result = sample_tuple.index('b', 2, 3)
print(result)  # error (index() は、指定された範囲内に要素が見つからない場合、エラーを発生させます。)

上記コードの場合、sample_tuple[2:3]の範囲で検索を行います。最初の'b'([1])は検索の範囲外で、2番目の'b'([3])も範囲外となるため、エラーになります。(スライスは"end"で指定した要素番号は含まないため。)

もし、最後の要素まで検索させたい場合は、"end"の指定は省略しましょう。

count()

count()メソッドは、tupleの要素のうち、指定された値と等しい要素の数を返します。

sample_tuple = ('a', 'b', 'c', 'a')
result = sample_tuple.count('a')
print(result)  # 2

上記コードの場合、tupleに'a'が2つ存在するため、実行結果は"2"になります。

count()メソッドは、要素が存在しない場合はエラーにならずに"0"を返します。

sample_tuple = ('a', 'b', 'c', 'a')
result = sample_tuple.count('z')
print(result)  # 0
スポンサーリンク