数弱の文系大学生によるブログです。

Python、Webデザイン関連の記事を投稿していけたらなと思っています。

備忘録的なブログなので、読みにくい文章だと思います。ご了承ください。

Python3の復習(リスト・タプル)

こんにちは。

かにたまごです。
晦日と元旦は勉強のことを忘れて思う存分遊んでました。
普段外に出ていないせいか、若干風邪気味です・・・。
体調は優れなくとも勉強意欲はありありなので、Python3をばちこり復習していきたいと思います。


前回の記事では、数値と文字列を確認しました。


今回は

  • リスト
  • タプル

という、複数のデータを扱う際に便利なデータ構造を復習していきます。

リスト

要素を順番に管理したい場合に使用されるデータ構造。
ミュータブルなので、順番を入れ替えたり内容を書き換えることが可能。

  • リストの作成
>>>Aqours = ["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ルビィ"]
>>>Aqours
 ["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ルビィ"]

list関数で作成することも可能。

>>>μ_s = list(["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"])
>>>μ_s
["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"]

ただ、この場合は「リストをリスト化」しているだけなので、意味がない。
リスト関数の使いどころで思いつくのは、「タプルをリスト化」とか?
タプルはイミュータブルで値の追加やソートといった変更ができないので
一度リスト化して何かしらの変更を加える感じ。

  • インデックス参照

文字列と同じく、インデックス番号で値を参照することができる。

>>>Aqours[0]
"高海千歌"

負の値で右端から取得できることも、文字列と同じ。

>>>Aqours[-1]
"黒澤ルビィ"
  • リストのリスト

データの型に関わらず、リストの中にリストを格納することが可能。

>>>Lovelive = [Aqours, μ_s]
>>>Lovelive
[["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ルビィ"],
["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"]]

インデックス番号[外側][内側]で参照できる

>>>Lovelive[0]
["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ルビィ"]
>>>Lovelive[1]
["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"]
>>>Lovelive[0][1]
"桜内梨子"
>>>Lovelive[1][1]
"絢瀬絵里"

文字列と同じく、スライスでリストのシーケンスを取り出すことができる。

>>>Lovelive[0][0:4]
["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ"]
  • 値の変更・追加・削除

インデックスを参照し、データを書き替えることができる。

>>>Lovelive[0][-1] = "黒澤ビィル"
>>>Lovelive
[["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ビィル"],
["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"]]

appendメソッドで値を追加する。

>>>Lovelive[0].append("黒澤ルビィ")
>>>Lovelive
[["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ビィル", "黒澤ルビィ"],
["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"]]

extendメソッドあるいは+=を使用してリストを結合。

>>>one = ["Lovelive"]
>>>two = ["Lovelive Sunshine"]
>>>one.extend(two)
>>>one
["Lovelive", "Lovelive Sunshine"]
>>>two += one
>>>two
["Lovelive Sunshine", "Lovelive", "Lovelive Sunshine"]

insertメソッドで、インデックスを指定して要素を追加。

>>>two.insert(2, "Lovelive")
>>>two
["Lovelive Sunshine", "Lovelive", "Lovelive", "Lovelive Sunshine"]

removeメソッドで値を指定して削除する。

>>>Lovelive[0].remove("矢澤ビィル")
>>>Lovelive
[["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ルビィ"],
["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"]]

リストのメソッドではないが、del文でインデックスを指定し、要素を削除することが可能。

>>>del Lovelive[0][-2]
>>>Lovelive
[["高海千歌", "桜内梨子", "松浦果南", "黒澤ダイヤ", "渡辺曜", "津島善子", "国木田花丸", "小原鞠莉", "黒澤ルビィ"],
["高坂穂乃果", "絢瀬絵里", "南ことり", "園田海未", "星空凛", "西木野真姫", "東條希", "小泉花陽", "矢澤にこ"]]

popメソッドでインデックスを指定し値を削除する。
削除された値が戻り値として返ってくる。

#デフォルトで-1が指定されている
>>>Lovelive[1].pop()
"矢澤にこ"
#引数にインデックスを指定して削除することも可能
>>>Lovelive[1].pop(0)
"高坂穂乃果"

補足説明
appendメソッドでリストの末尾に要素を追加し、popメソッド(デフォルトの-1が指定されている状態)でリストの末尾から要素を取り出すデータ構造をLIFO(Last In, First Out: 後入れ先出し)という。スタックと呼ばれることが多い。

  • その他

indexメソッドでリスト内のインデックス番号を取得することができる。

>>>Lovelive[0].index("渡辺曜")
4

in でリスト内にある要素が存在するか確認することができる。

>>> "黒澤ビィル" in Lovelive[0]
False
>>>"黒澤ルビィ" in Lovelive[0]
True

countメソッドである要素がいくつ含まれているかを確認することができる。

>>>two
["Lovelive Sunshine", "Lovelive", "Lovelive", "Lovelive Sunshine"]
>>>two.count("Lovelive")
2

sortメソッドあるいはsorted関数でリスト内要素をソートする。
sorted関数はソートされたリストのコピーを返すのに対し、sortメソッドはそのリスト自体をソートする。
デフォルトでは昇順(小さい順)にソートされ、降順(大きい順)にしたい場合はreverse=Trueを指定する。

>>>test_title = ["Lovelive2", "Lovelive1"]
>>>test_title
["Lovelive2", "Lovelive1"]
>>>return_title = sorted(test_title)
>>>return_title
["Lovelive1", "Lovelive2"]
>>>test_title
["Lovelive2", "Lovelive1"]
>>>test_title.sort()
>>>test_title
["Lovelive1", "Lovelive2"]
>>>test_title.sort(reverse=True)
>>>test_title
["Lovelive2", "Lovelive1"]

copyメソッドでリストをコピーする。

>>>two
["Lovelive Sunshine", "Lovelive", "Lovelive", "Lovelive Sunshine"]
>>>copy_two = two.copy()
>>>copy_two
["Lovelive Sunshine", "Lovelive", "Lovelive", "Lovelive Sunshine"]

リスト関数やスライスでの取得でコピーを返すことも可能。

>>>two
["Lovelive Sunshine", "Lovelive", "Lovelive", "Lovelive Sunshine"]
>>>list_two = list(two)
>>>list_two
["Lovelive Sunshine", "Lovelive", "Lovelive", "Lovelive Sunshine"]
>>>slice_two = two[:]
>>>slice_two
["Lovelive Sunshine", "Lovelive", "Lovelive", "Lovelive Sunshine"]

ここで注意したいのが、「リストの代入」はコピーを生成しているわけではないということ。

>>>name1 = ["諏訪ななか"]
>>>name2 = name1
>>>name2
["諏訪ななか"]
>>>name1[0] = "斉藤朱夏"
>>>name1
["斉藤朱夏"]
>>>name2
["斉藤朱夏"]

データが格納されている場所へのアドレスをコピーしているだけなので、アドレス先にあるデータはname1と同じ部分を指している感じ?
なので、データを書き換えると同じアドレスを参照しているname2の出力結果も変わっている。
いわゆる値型と参照型の違いかな?(C#で少しやった覚えが・・・)

タプル

イミュータブル(変更不可)のデータ構造。
定義した後は、要素の変更・追加・削除はできない。

  • タプルの作成

丸括弧でタプルを作成することができる。

>>>empty = ()
>>>empty

要素をカンマで区切って作成することもできる(これ初めて知った)。

>>>cute = "矢島舞美", "鈴木愛理", "岡井千聖", "中島早貴", "萩原舞"
>>>cute
>>>("矢島舞美", "鈴木愛理", "岡井千聖", "中島早貴", "萩原舞")

タプルの定義は「カンマ」なので、丸括弧は必須ではない。
分かりやすくタプルを定義する場合は丸括弧+カンマを使用すると良い。


ただ、空のタプルを定義する場合は、tuple関数か丸括弧を用いる必要がある。

>>>emp = ,
File "C:\Users\***\Desktop\Python\Test\basicInfoTest.py", line 1
SyntaxError: invalid syntax
>>>emp1 = ()
>>>emp1
>>>()
>>>emp2 = tuple()
>>>emp2
()
  • アンパック代入

リストでもできるが、データを展開して代入することが可能。

>>>t = (1, 2, 3)
>>>one, two, three = t
>>>one
1
>>>two
2
>>>three
3

  • タプルのメリット

これは参考にしている書籍に書いてあることをメモ書きとして残しておきます。

  • 消費スペースが小さい
  • 誤って書き換える危険が少ない
  • 辞書のキーとして使える
  • 名前付きタプルは、オブジェクトの単純な代用品として使える
  • 関数の引数は、タプルとして渡される


書き終わってから思ったけど、ラブライブを例にする必要あった??
キャラ名とか調べつつやったから、割と時間食ったな。
それもこれも、昨年の30日に帰ってきた兄がラブライブサンシャインにドハマりしていて
夜中の2, 3時までラブライブの素晴らしさについて熱弁されたせいだ・・・。
思い付きで書き始めるのはやめておこう。


ただただラブライブが観たくなるだけの復習時間でした(;^ω^)


以上です。