5. タプルとシーケンス

5-1. タプル
 Pythonでは、括弧( )で囲んだコンマ区切りの要素の並び(例えば、(1, 2, 3, 4, 5)、("a", "b", "c", "d", "e")など)をリスト型(リスト)として取り扱います。タプルの型はtuple型になります.なお,タプルの( )は省略してもよい場面があります.

▽サンプルプログラム5-1. タプルとtuple型

print((1,2,3,4,5))
print(("a","b","c","d","e"))
print("a","b","c","d","e")
print(type((1,2,3,4,5)))
a=("a","b","c","d","e")
print(a)
a="a","b","c","d","e"
print(a)
▼プログラミングセル5-1. packages = [] terminal = false

5-2. 演算子によるタプルの操作
 リストと同様に、演算子+を使ってタプルの要素を連結することができます。また、演算子*を使うとタプルの要素を繰り返すことができます。タプルでは、タプルの要素が数値でも文字列でも連結することができます。ただし、タプルとリストを連結することはできません。

▽サンプルプログラム5-2. リストの操作

print((1,2)+(3,4))
print((1,2)*3)
a=("a","b")
b=("c","d")
print(a+b)
a=(1,2)
b=("c","d")
print(a+b)
a=(1,2)
b=["c","d"]
print(a+b) #エラー
▼プログラミングセル5-2.

5-3. タプルの長さ
 len関数を用いるとタプルの長さ(要素数)を整数値として取得できます。このlen関数は利用する機会が多いので注意しておきましょう。

▽サンプルプログラム5-3. タプルの長さ

print(len((1,2,3,4,5)))
a=("H","i","r","o","s","h","i","m","a")
print(len(a))
▼プログラミングセル5-3.

5-4. インデックスによるタプル要素の取得
 文字列やリストと同様に、タプルからインデックス([数字]という添字)を使ってタプルの要素を取得することができます。添字[0]だと最初の要素、添字[1]だと2番目の要素、添字[2]だと3番目の要素といった具合です。インデックスにはマイナス値も指定できます。添字[-1]は最後列の要素、添字[-2]は最後からの2番目の要素といった具合です。なお、添字の指定した数が実際の数をオーバーする場合はエラーになる点に注意してください。

▽サンプルプログラム5-4. インデックスによるタプル要素の取得

a=("a","b","c","d","e")
print(a[0])
print(a[1])
print(a[2])
a=("a","b","c","d","e")
print(a[-1])
print(a[-2])
print(a[-3])
a=("a","b","c","d","e")
print(a[15]) #エラー
a=("a","b","c","d","e")
print(a[-15]) #エラー
▼プログラミングセル5-4.

5-5. スライスによるタプル要素の取得
 文字列やリストと同様に、タプルからスライス([数字:数字]との添字)を使ってタプル要素を取得することができます。スライスを使うことで添字[X:Y]の部分リスト(開始値Xから始まり、終了値Yの1つ前まで)を取得することができます。開始値の要素は常に含まれ、終了値の要素は含まれない点に注意してください。指定した数が実際の数をオーバーした場合は、端から自動的に取得してくれます。また、先頭もしくは最後を指定したい場合は数値を省略することもできます。なお、添字[X:Y:Z]と指定した場合、X~Yの部分リストからZ間隔で要素を取り出します。

▽サンプルプログラム5-5. スライスによるタプル要素の取得

a=("a","b","c","d","e","f","g","h","i")
print(a[0:2])
print(a[4:6])
print(a[5:15])
print(a[-15:15])
print(a[:6])
print(a[-5:])
print(a[:])
print(a[::2])
print(a[1::3])
▼プログラミングセル5-5.

5-6. タプルの不変性
 文字列と同様に、タプルは変更することができない不変なものである点に注意してください。文字列を変更したい場合は、変更後の文字列を新しく別に作成する必要があります。

▽サンプルプログラム5-6. タプルの不変性

a=("P","y","t","h","o","n")
a[0]="C" #エラー
a=("P","y","t","h","o","n")
b = ("C",)+(a[1:]) #,がないとエラーになる点に注意
print(b)
▼プログラミングセル5-6.

5-7. タプルの入れ子
 リストと同様に、タプルの中の要素にタプルを代入することもできます。この状態を入れ子(またはネスト)と呼びます。

▽サンプルプログラム5-7. タプルの入れ子

a=("a","b","c",("A","B","C"))
print(a) 
print(a[0]) #先頭の要素の表示
print(a[3]) #4番目の要素の表示
print(a[3][0]) #4番目の要素内の先頭の要素を表示
a[3][1]=100 #エラー
▼プログラミングセル5-7.

5-8. シーケンス
 文字列やリスト,タプルはシーケンスと呼ばれる形(データ構造)になります(その他にrange関数もシーケンスに属します)。シーケンスとは、カンマで区切られた要素が並んでいるオブジェクトのことです。繰り返し文では、シーケンス情報に基づいて繰り返し処理を実施しています。以下に多くのシーケンスに共通するシーケンス演算を紹介します。表内で、 s と t は同じ型のシーケンス、n、i、j、kは整数、xはsに課された型と値の条件を満たす任意のオブジェクトです。

演算機能
x in ssのある要素がxと等しければTrue、そうでなければFalse
x not in ssのある要素がxと等しければFalse、そうでなければTrue
s+tsとtの結合
s*nまたはn*ss自身をn回足すのと同じ
s[i]sの0から数えてi番目の要素
s[i:j]sのiからjまでのスライス
s[i:j:k]sのiからjまで、k毎のスライス
len(s)sの長さ
min(s)sの最小の要素
max(s)sの最大の要素
s.index(x[, i[, j]])s中でxが最初に出現するインデックス (インデックスi以降からインデックスjまでの範囲)。値がない場合はValueError
s.count(x)s中にxが出現する回数
※Python3.12.0ドキュメンテーション>>ライブラリー>>シーケンス型 --- list, tuple, range(https://docs.python.org/ja/3/library/stdtypes.html#sequence-types-list-tuple-range)を一部改変

▽サンプルプログラム5-8. シーケンス演算

a=(1, 2, 3, 4, 5)
print(3 in a)
print(3 not in a)
b=(3, 4, 5, 6)
c=a+b
print(c)
print(min(c))
print(max(c))
print(c.index(4))
print(c.index(4, 4))
print(c.index(4, 4, 6)) #値がない場合ValueError
▼プログラミングセル5-8.

問題
 以下の問題に解答しましょう。ただし、1~5の数値をタプルaに、a~eの英字をタプルbに格納した状態を前提とします。

  1. b[3]="f"の結果を記述してください。
  2. c=b+aを実施したとき、cの要素を記述してください。
  3. c*2の要素の数を調べて表示するプログラムを記述してください。
  4. ▼プログラミングセル
  5. cに対して、以下の要素をインデックスとスライスを使って表示させましょう。
    1. 先頭から2番目の文字
    2. 最後から5番目の文字
    3. 先頭から3番目~7番目の文字列
    4. 最後尾から4番目~6番目の文字列
    5. 偶数番目の文字
    ▼プログラミングセル
  6. 以下の3行3列の行列を行ごとにタプルに格納してください。
  7. 1 2 3
    4 5 6
    7 8 9
    
    ▼プログラミングセル