nanana、リスト型・タプル型を学ぶ(Python学習記録-4日目-)

■まえおき

下記の記事でPython学び直してやるぞーと宣言しました。 nanana-dot.hatenablog.com

今回はデータ型の中でも、「リスト型」や「タプル型」といった種類の型について理解を深めたいと思います。

■今日の学び

  • 「リスト」と「タプル」のような複数要素をインデックスで指定できるものシーケンス型という
  • リスト型に使える組み込みメソッド・組み込み関数を使いこなす

■リスト型・タプル型の特徴

前の記事でPythonが扱う代表的なデータ型に関してまとめました。

nanana-dot.hatenablog.com

そのなかにリスト型とタプル型というのがあります。
今回はこれらのデータ型に関して整理して、Pythonがもつ操作の魅力をみていくこととしましょう。

リスト型やタプル型は複数のデータをひとつのまとまりとして扱うの利用できます。
たとえば、リスト型やタプル型というのは次のような形をしています。

#リスト型は[ ]で定義する  
numList = [1,2,3,4,5]
strList = ['a', 'b' ,'c', 'd', 'e']  

#タプル型は( )で定義する  
numtuple = (1,2,3,4,5)
strtuple = ('a', 'b' ,'c', 'd', 'e')

リスト型やタプル型のように複数の要素をもっていて、
それぞれの要素が順番に番号付したインデックスで指摘できるようなデータ型を、
Pythonではシーケンス型と分類します。
文字列も各文字がそれぞれ文字列を作る要素となり、インデックスで指定できますので、 文字列型もシーケンス型のひとつです。

まずはシーケンス型の扱いの基本として、
各要素を表すインデックスをつかって、要素の指定をしてみましょう。

s = '1,2,3,4,5'
s[0]  #sの第1要素を出力  
s[-1] #sの最後尾要素を出力  
s[4:] #s[インデックス:]でインデックスから末尾まで  
s[:3] #s[:インデックス]で先頭からインデックス-1まで  
s[2:4:]#s[インデック:インデックス]で指定した範囲の要素  
s[1:6:2]#s[インデック:インデックス:ステップ]で指定した要素数ごと  

というよう書くと、
このコードの出力は次のようになります。

'1'  
'5'  
'3,4,5'  
'1,2'  
'2,3'  
'234'

''s[インデックス:]'' のようにシーケンス型の特定の要素を取り出す操作を
スライスとかスラッシングと言います。
上の例では文字列でやりましたが、リスト型やタプル型でも同様のことができます。

リスト型とタプル型の違い「ミュータブル」

リスト型とタプル型は値をまとめて扱うという点では一見似ているかもしれません。
しかし、両者には決定的な違いがあります。
それはリスト型は「一度入れた値でも何度でも値を更新することができる」一方で、
タプル型は「一度入れた値は書き換えることができない」という特徴があります。
リスト型のような、一度セットした中身を書き換えられることを「ミュータブル(mutable)」と言います。

下記のようなお寿司のネタをリスト型で書くとします。

sushiNeta = ['マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'エビ']

ここでに、「エビ」ではなく「ボタンエビ」に変更したいと思った時は、

sushiNeta[5] =  'ボタンエビ'
print(sushiNeta)

とすればたしかにエビがボタンエビになったリストに変更することができる。

#出力
['マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'ボタンエビ']

一方で同じようにネタをタプル型で書いてみて、同様のことを使用しようとすると、

sushiNeta = ('マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'エビ')
newsushiNeta = sushiNeta + ('イカ')
print(newsushiNeta)

と書いて実行すると、

#出力
['マグロ', 'カツオ', 'タイ', 'タコ', 'サーモン', 'ボタンエビ']

とエラーが出てしまい、タプルの中の値を書き換えることができません。 でも要素の一部を書き換えることができないというのはタプルだけではなく、
文字列も同じですよね。

リスト型がけっこう自由な感じで、タプル型はわりとかちっと硬いイメージを持ちました。

リスト型のメソッド

リスト型の処理で、forとの組み合わせで繰り返し処理するような場面で使われることがあります。 前回の記事でfor文の書き方の一例をとりあげました。

nanana-dot.hatenablog.com

しかし、rangeをつかうだけじゃなく、つぎのようにリスト型を利用することもできます。

for sushiOrder in   ['マグロ', 'カツオ', 'タイ']
print(sushiOrder)

このようなに処理を繰り返すたびに、
「sushiOrder」にはリスト型の要素が1つずつ順番に格納されていきます。
最終的にはリスト型のすべての要素に対して処理をすることができるというわけです。

最後にリストの操作のためにつかえる関数やメソッドをいくつか見てみようと思います。
リストに要素をくわえたいときはappendメソッドを使います。

sushi =  ['マグロ', 'カツオ', 'タイ']  
gunkan = ['ねぎとろ', 'かにみそ', 'いくら']
sushi.append(gunkan)
print(sushi)

とすると、出力は

 ['マグロ', 'カツオ', 'タイ', 'ねぎとろ', 'かにみそ', 'いくら'] 

となります。

他にもリストの中に特定の値がいくつ含まれているかはcountメソッドで知ることができて便利です。 たとえば、お寿司の注文履歴が書かれたリストがあったとき、
「マグロ」が何回注文されたか知りたければ、

sushiOrder = ['マグロ', 'サーモン', 'イカ', 'マグロ', 'ホタテ', 'マグロ']
sushiOrder.count('マグロ')
  #出力
3

となります。

次回はこの記事で触れられなかった「リストの内包表記」を触れたいと思います。


本日の学習時間:2時間
累計の学習時間:8時間