Pythonチュートリアル(5章)の内容を箇条書きでまとめた

前の記事：[Pythonチュートリアル(4章)の内容を箇条書きでまとめた](https://qiita.com/Wakii/items/39fb6eee9250c4196a61)

#はじめに
[Python3 エンジニア認定基礎試験](https://www.pythonic-exam.com/exam/basic)対策として、Pythonチュートリアル(書籍)の内容を暗記しやすい箇条書きにまとめた自分用メモです。

##参考資料
Pythonチュートリアル： https://docs.python.org/ja/3/tutorial/
5章： https://docs.python.org/ja/3/tutorial/datastructures.html
書籍： https://www.oreilly.co.jp/books/9784873117539/

#"5章 データ構造"
- Python3 エンジニア認定基礎試験の配点
    - 7 / 40問(17.5%) ☆☆☆☆★(重要度：中＋)
- テーマ
    - リスト
    - タプル
    - 集合
    - ディクショナリ
    - 比較演算子とブール演算子による評価
    - シーケンスやその他オブジェクトの比較

#5.1 リストについての補足
- 以下はリストオブジェクトの全メソッドである。

|メソッド名|説明|
|:--|:--|
|list.append(x)                    |値xのアイテムを末尾に追加する。|
|list.extend(L)                    |リストLの全アイテムを末尾に追加する。|
|list.insert(i, x)                 |インデックスiの位置に値xのアイテムを追加する。|
|list.remove(x)                    |値がxでインデックスが最小のアイテムを削除する。<br>該当アイテムが存在しない場合はエラー。|
|list.pop([i])  　　　　　　　　　　 |インデックスiの位置のアイテムを削除して返す。<br>インデックスは省略可能で、省略した場合は最後のアイテムを削除・返却する。|
|list.clear()                      |全てのアイテムを削除する。|
|list.index(x)                     |値がxとなるアイテムの最小インデックスを返す。<br>該当アイテムが存在しない場合はエラー。|
|list.count(x)                     |値がxとなるアイテムの個数を返す。|
|list.sort(key=None, reverse=False)|アイテムをインプレースでソートする。|
|list.reverse()                    |アイテムをインプレースで逆順にする。|
|list.copy()                       |リストのシャローコピーを返す。|

##5.1.1 リストをスタックとして使う
- スタックは後入れ先出し (last-in, first-out)。
- スタックに積むにはappend(x)を使う。
- スタックからの取得はpop()を使う。 
- リスト末尾の操作なので高速。

##5.1.2 リストをキューとして使う
- キューは先入れ先出し (first-in, first-out)。
- キューに入れるにはinsert(0, x)を使う。
- キューからの取得はpop()を使う。
- リスト先頭の操作なので低速。
    - キューの実装はリストよりコレクションを使うとよい。

##5.1.3 リスト内包
- **リスト内包**とは、式とそれに続くfor節からなり、後ろに0個以上のfor節やif節を続けて、全体を[]で囲んだものである。
    - *squares =* *[x\*\*2 for x in range(10)]* # 0\*\*0 ~ 9\*\*9 のリスト内包
- リスト内包には複合式や入れ子の関数を含めることができる。
- リスト内包のよくある使い方
    - シーケンスや反復可能体の各メンバに処理を加えて新しいリストを生成する
    - 条件に合致する要素を取り出してサブシーケンスを作成する 

##5.1.4 入れ子のリスト内包
- リスト内包の先頭の式にはあらゆる式が使える。
    - 入れ子のリスト内包 (先頭式に別のリスト内包を入れる) もできる。

#5.2 del文
- **del文**を使うと、リストのアイテムをインデックス指定で削除できる。<br>変数の削除も可能。
    - *del a[0]* # インデックス0のアイテムを削除
    - *del a[2:4]* # インデックス2, 3のアイテムを削除
    - *del a[:]* # 全てのアイテムを削除
    - *del a* # 変数 a を削除
- pop() と違い、削除したアイテムを返さない。
- remove() は引数と値が一致する最初のアイテムを削除する。

#5.3 タプルとシーケンス
- **タプル**はシーケンスの一種で、カンマ区切り値で構成される。
    - 文字列やリストと同様に、インデックスやスライス演算も可能。
- タプルを定義することをタプル・パッキングという。
    - *t = (12345, 54321, 'hello!')* # ()は省略可能
    - *empty = ()* # アイテム数0のタプル
    - *singleton = 'hello',* # アイテム数1のタプル(末尾のカンマがポイント)
- タプルを出力すると()で囲まれる。
    - print(t) # (12345, 54321, 'hello!') を出力
- タプルのアイテムを個別の変数などに代入することを**シーケンス・アンパッキング**という。
    - *x, y, z = t* # 変数 x に 12345, y に 54321, z に 'hello!' が代入される。
    - 変数の数とタプルのアイテム数は一致させること。 
    - アンパッキングを利用して**多重代入**ができる。
        - *x, y, z = 1, 2, 3* # タプル(x, y, z)の各アイテムにタプル(1, 2, 3)の値を代入
- タプルとリストの違い
    - 変更不能体 (immmutable) である。
        - アイテムとしてリストなどの変更可能体を含めることはできる。
    - 各アイテムには一般的にアンパッキングやインデックスでアクセスする。
    - 異なるデータ型のアイテムが混在することが多い。
   
#5.4 集合 (set)
- **集合**とは重複しない要素を順不同で集めたもの。
- Pythonには**集合オブジェクト**があり、生成には、{} や **set() 関数**を使用する。
    - 空の集合の生成には set() を使う。
    - リスト内包と同じように**集合内包**も書ける。
        - *a = {x for x in 'abracadabra' if x not in 'abc'}*
- 和、交差、差、対称差などの数学的演算をサポートする。

| 集合演算 | 説明 |
|:--|:--|
|a in x<br>[存在判定]|集合aに要素xがあればTrue(真)<br>なければFalse(偽)|
|a &#124; b<br>[和]|aまたはbにある要素の集合|
|a - b<br>[差]|aにあってbにない要素の集合|
|a & b<br>[交差]|aにもbにもある要素の集合|
|a ^ b<br>[対称差]|aまたはbにある共通しない要素の集合|

#5.5 ディクショナリ
- **ディクショナリ**は「キー : 値」ペアによるソートされない集合体。
    - *tel = {'jack': 4098, 'sape': 4139}*
    - *print(tel['jack'])* # 4098を返す
    - *print(tel)* # {'jack': 4098, 'sape': 4139} を返す
    - *empty = {}* # 空のディクショナリ
- キーは重複不可で、あらゆる変更不能体が使える。
    - 文字列
    - 数値
    - タプル (可変型オブジェクトを含まないこと)
- ディクショナリへの追加、削除、存在確認はキーを指定する。
    - *tel['guido'] = 4127* # tel に 'guido': 4127 が追加される
    - *del tel['jack']* # tel から 'jack': 4098 が削除される
    - *'sape' in tel* # 存在：True(真)
    - *'test' in tel* # 存在：False(偽)
- **keys() メソッド**でキー一覧の反復可能体 (iterable) を取得できる。
    - *keylist = list(tel.keys())* # キー一覧をリスト形式で取得
    - *keysort = sorted(tel.keys())* # キー一覧をソートしたリスト形式で取得
    - ちなみにチュートリアルにはないが、**values() メソッド**で値の一覧を取得。
- **dict() コンストラクタ**でタプルからディクショナリを作れる。
    - *tel = dict([('jack', 4098), ('sape', 4139)])* # tel = {'jack': 4098, 'sape': 4139} と同じ
- リストやタプルと同様に、**辞書内包**もある。
    - *dic = {x: x\**2 for x in (2, 4, 6)}* # dic = {2: 4, 4: 16, 6: 36} と同じ

#5.6 ループのテクニック
- ディクショナリの**items() メソッド**を使うと、(キー, 値)のタプル一覧(反復可能体)を取得できる。
- **enumerate() 関数**にシーケンスを渡すと、(インデックス, 値)のタプル一覧(反復可能体)を取得できる。
- **zip() 関数**に二つ以上のシーケンスを渡すと、(シーケンス1の値, シーケンス2の値...)のタプル一覧(反復可能体)を取得できる。
- **reversed() 関数**にシーケンスを渡すと、インデックス逆順のアイテム一覧(反復可能体)を取得できる。
    - 元のシーケンスの内容は書き換えない。
    - 下のsort()と違いリストが返ってくるわけではないので注意。
- **sort() 関数**にシーケンスを渡すと、アイテムをソートした新しいリストを取得できる。
    - 元のシーケンスの内容は書き換えない。

#5.7 条件についての補足
- 条件の判定に使う演算子には、**数値演算子**、**比較演算子**、**ブール演算子**がある。
- 条件の判定結果は**not** による否定ができる。

|演算子|説明|
|:--|:--|
|**比較演算子**|[==, !=, <, <=, >=, >](https://qiita.com/Wakii/items/cc4158d602a7646758d9#32-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AF%E3%81%98%E3%82%81%E3%81%AE%E4%B8%80%E6%AD%A9) 以外もある|
|a in x    |a がシーケンスx に含まれていたらTrue(真)|
|a not in x|a がシーケンスx に含まれていなかったらTrue(真)|
|a is x    |a と b が同じインスタンスならTrue(真)|
|a is not x|a と b が同じインスタンスでなかったらTrue(真)|
|**ブール演算子**|別名、短絡演算子|
|A and B   |A も B もTrue(真)ならTrue(真)|
|A or B    |A または B がTrue(真)ならTrue(真)|
|not A     |A がTrue(真)ならFalse(偽)<br>A がFalse(偽)ならTrue(真)|
   
- 演算子の優先順位は 数値演算子 > 比較演算子 > not > and > or
- () で囲むことで優先順位をコントロールできる。
- 比較演算子は**連鎖**できる。
    - *if a < b == c:* # (a < b) and (b == c) と同じ
- ブール演算子は評価を右から左に行い、評価が決まった時点で終了する。
    - *A and B and C*
        - A and B がFalse(偽)なら、and C は評価しない
    - *A or B or C*
        - A or B がTrue(真)なら、or C は評価しない
    - ブール値でなく一般値が使われた場合、短絡演算子の返り値は最後に評価された引数となる。
- 比較などのブール式の結果は変数に代入できる。
    - 式の中での代入はできない。

#5.8 シーケンスの比較、その他の型の比較
- シーケンス型のオブジェクトの大小比較は以下のステップで評価される。
    1. インデックス0のアイテム同士を比較し、大きい方を「大」と評価する。
    2. アイテムが同じ大きさなら、インデックスを+1して次のアイテム同士を比較。
    3. 異なる大きさのアイテムが見つかるか、どちらかが終端に行くまで2.を繰り返す。
        - 両方のすべてのアイテムが同じ大きさなら、両者は同じ大きさと判断する。
        - 片方が先に終端に達した場合、そちらを「小」と評価する。
        - 文字列の大小関係はUnicodeコードポイント番号で比較される。
        - シーケンスのアイテムがシーケンスだった場合、そのアイテム同士も同じルールで比較される。
- 異なる型のオブジェクト同士の比較は、基本的に**TypeError例外**が返される。
    - 数値同士の比較(intとfloatなど)は可能。
    - オブジェクトに用意されている適切な比較メソッドが使える場合もある。

次の記事：[Pythonチュートリアル(6章)の内容を箇条書きでまとめた](https://qiita.com/Wakii/items/be7065faf917d7881610)