python データ構造メモ

[ゲームを作りながら楽しく学べるPythonプログラミング](https://www.amazon.co.jp/dp/product/B06XRQS8PN/ref=as_li_tf_tl?camp=247&creative=1211&creativeASIN=B06XRQS8PN&ie=UTF8&linkCode=as2&tag=bookmeter_book_image_image_pc_logo)
の書籍を元に、気になったもの・多用しそうなものだけをざっくりとまとめた

データ構造は ~~リスト・タプル・辞書の3種類ある~~
リスト・タプル・集合・辞書の4種類ある

### リスト(list)

**可変**の配列
途中で値の変更、要素の追加・削除ができる

``` python
>>> subject = [78, 95, 68, 62] # リスト定義
>>> subject
[78, 95, 68, 62]
>>> 
>>> subject[0] = 70 # 値の変更
>>> subject
[70, 95, 68, 62]
>>> 
>>> subject.append(34) # 要素の追加
>>> subject
[70, 95, 68, 62, 34]
```


### タプル(tuple)

**不変**の配列
途中で値の変更、要素の追加・削除ができない

``` python
>>> subject = (78, 95, 68, 62) #　タプル定義
>>> subject
(78, 95, 68, 62)
>>> 
>>> subject[0] = 70 # 値の変更
Traceback (most recent call last): # エラー
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> 
>>> subject.append(34) # 要素の追加
Traceback (most recent call last): # エラー
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
```

#### アンパック

タプルを各変数に代入することもできる(リストでも可)

```python
>>> pos = (56, 74)
>>> pos_x, pos_y = pos
>>> pos_x
56
>>> pos_y
74
```

### 集合(set)

リストと似ているが、
重複した要素は持たない、順番が無いのが特徴

```python
>>> basket={"apple", "orange", "banana"} # setオブジェクト定義. set(["apple", ...])の形でも可
>>> basket
{'orange', 'apple', 'banana'}
>>> basket.add("melon") # 要素追加
>>> basket
{'orange', 'melon', 'apple', 'banana'}
>>> basket.add("apple") # 重複した要素を追加した場合、無視される
>>> basket
{'orange', 'melon', 'apple', 'banana'}
>>> 

# 集合の計算も可能
>>> a = {1, 2, 4, 8, 16}
>>> b = {1, 2, 3, 5, 8}
>>> a | b # 和集合
{1, 2, 3, 4, 5, 8, 16}
>>> a & b # 積集合
{8, 1, 2}
>>> a ^ b # 排他的論理和
{16, 3, 4, 5}
>>> a - b # 差集合
{16, 4}
>>> b - a
{3, 5}
```



### 辞書(dict)

`{キー: 値}` がペアのリスト
可変なので、後から追加・編集も可能


```python
>>> score = {
... "math":78,
... "english":95,
... "chemistry":68,
... "science":62, # 最後に 「,」付いてても エラーにならないのが地味にうれしい
... }
>>> score
{'math': 78, 'english': 95, 'chemistry': 68, 'science': 62}
>>> score["math"] # キーを指定
78
# 追加
>>> score["japanese"] = 23
>>> score["japanese"] # キーを指定
23
# 編集
>>> score["math"] = 68
>>> score["math"] # キーを指定
68

# 辞書の中に辞書も入れられる
>>> score = {
... "math":{
... "mathA":50,
... "mathII":28
... },
... "english":95,
... }
>>> score
{'math': {'mathA': 50, 'mathII': 28}, 'english': 95}
>>>
>>> score["math"]["mathA"] # キーを指定
50
```


## リストやタプル利用する上で便利な関数

### copy

指定したリスト、タプルを複製する
辞書でも可能

``` python
>>> a = [1,2,3]
>>> b = a.copy()
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]

# aの3番目の要素に9を代入
>>> a[2] = 9
>>> a
[1, 2, 9]
# 別参照なので、b[2]は３のまま
>>> b
[1, 2, 3]
>>> 
```

代入の場合は a bともに同じ場所を参照してしまう

``` python
>>> a = [1,2,3]
>>> b = a
# aの3番目の要素に9を代入
>>> a[2] = 9
>>> a
[1, 2, 9]
# 同じ場所を参照しているので、b[2]も9
>>> b
[1, 2, 9]

```

### in演算子

ある値がリストやタプルに含まれているか

`調べたい値 in リスト/タプル`

``` python
>>> greets = ("morning", "afternoon", "evening")
>>> "noon" in greets
False
>>> "afternoon" in greets
True
```

### print関数

引数で与えられた情報をコンソールに表示する

```python
>>> print("hello")
hello

# 引数を複数指定することも可能
>>> print("Hi!", "Python", 3)
Hi! Python 3
```

#### %演算子を使う方法

`"文字列" % ("値")`

```python
>>> "1=%s 2=%s" % ("Hello", "World")
'1=Hello 2=World'

>>> "value=(%d, %.1f)" % (2.5, 2.5)
'value=(2, 2.5)'
```

#### formatメソッドを使う方法
~~新しく追加された方法でこっちが主流らしい~~
python3.6 から新しく f-strings(フォーマット済み文字列リテラル)が追加された。

`{}` が埋め込み文字

`"埋め込み文字を含めた文字列".format("値")`

```python
>>> "1={} 2={}".format("Hello", "World")
'1=Hello 2=World'
>>> "value=({}, {})".format(2, 2.5)
'value=(2, 2.5)'

# {}の中に番号をつけることで、任意の順番にもできる
>>> "value=({1}, {0})".format(2, 2.5)
'value=(2.5, 2)'

# 名前をつけることも可能
>>> "value=({latitude}, {longitude})".format(latitude=35.6, longitude=139.6)
'value=(35.6, 139.6)'
```

#### f-strings(フォーマット済み文字列リテラル)を使う方法

python3.6で追加された手法
接頭辞 `f` (`F`でも可) + `"文字列"` 

```python
>>> latitude = 35.6
>>> longitude = 139.6
>>> f"value=({latitude}, {longitude})"
'value=(35.6, 139.6)
```