[Python3 入門 6日目] 3章 Pyの具リスト、タプル、辞書、集合（3.2.7〜3.2.19）


## 3.2.7 append()による末尾への要素追加
リストに要素を追加するための方法として伝統的にappend()で末尾に一つずつ追加していく方法。

```py
>>> marxes=["TTTTTT","aaaa","bbbb"]
>>> marxes.append("Zeppo")
>>> marxes
['TTTTTT', 'aaaa', 'CCCC', 'Zeppo']
```

## 3.2.8 extend()または+=を使ったリストの結合
extend()を使えば二つの**リスト**を結合できる。

```py

>>> marxes
['TTTTTT', 'aaaa', 'CCCC', 'Zeppo']
>>> others=["Gummo","Karl"]
>>> marxes.extend(others)
>>> marxes
['TTTTTT', 'aaaa', 'CCCC', 'Zeppo', 'Gummo', 'Karl']
>>> marxes=["TTTTTT",'aaaa', 'CCCC']
>>> others=["Gummo","Karl"]
>>> marxes+=others
>>> marxes
['TTTTTT', 'aaaa', 'CCCC', 'Gummo', 'Karl']

```

この時、append()を使うとothersの要素ではなく1個のリスト要素として追加されてしまう。
これもまたリストが異なる型を持てることを示している。

```py
>>> marxes=["TTTTTT",'aaaa', 'CCCC']
>>> others=["Gummo","Karl"]
>>> marxes.append(others)
>>> marxes
['TTTTTT', 'aaaa', 'CCCC', ['Gummo', 'Karl']]
>>> marxes
['TTTTTT', 'aaaa', 'CCCC', ['Gummo', 'Karl']]
```


## 3.2.9 insert()によるオフセットを指定した要素の追加
append()関数はリストの末尾にしか要素を追加できなっかったが、リストのオフセットを指定しその前に要素を追加したいときはinsert()関数を使う。

```py

>>> marxes.insert(3,"Gummo")
>>> marxes
['TTTTTT', 'aaaa', 'CCCC', 'Gummo', ['Gummo', 'Karl']]

#末尾を超えるオフセットを指定するとappend()と同じようにリストの末尾に挿入される。
>>> marxes.insert(10,"XXXXXX")
>>> marxes
['TTTTTT', 'aaaa', 'CCCC', 'Gummo', ['Gummo', 'Karl'], 'XXXXXX']
```

## 3.2.10 delによる指定したオフセットの要素の削除


```py
>>> marxes=["Groucho","Choico", 'Haapo',"Gummo","Zepppo"]
>>> del marxes[-1]
>>> marxes
['Groucho', 'Choico', 'Haapo', 'Gummo']
>>> marxes=["Groucho","Choico", 'Haapo',"Gummo","Zepppo"]
>>> marxes[2]
'Haapo'
>>> del marxes[2]
>>> marxes
['Groucho', 'Choico', 'Gummo', 'Zepppo']
```

delはPythonの文であってリストのメソッドではないのでmarxes[-2].del()とは書かない。
delは代入の逆のようなものでPythonオブジェクトから名前を切り離し、その名前がオブジェクトの最後の参照ならオブジェクトのメモリを解放する。



## 3.2.11 remove()による値に基づく要素の削除
削除したい要素の位置を気にしない場合、remove()を使って値を指定して要素を削除する。

```py

>>> marxes=["Groucho","Choico", 'Haapo',"Gummo","Zepppo"]
>>> marxes.remove("Gummo")
>>> marxes
['Groucho', 'Choico', 'Haapo', 'Zepppo']
```

## 3.2.12 pop()でオフセットを指定して要素を取り出し、削除する方法
pop()を使えばリストから要素を取り出し、同時にリストから要素を削除できる。

オフセットを指定してpop()を呼び出すと、そのオフセットの要素が返される。引数を指定しなければオフセットとして-1が使われる。
pop(0)はリストヘッド、pop()またはpop(-1)は末尾を返す。


```py
>>> marxes=["Groucho","Choico", 'Haapo',"Zepppo"]
>>> marxes.pop()
'Zepppo'
>>> marxes
['Groucho', 'Choico', 'Haapo']
>>> marxes.pop(1)
'Choico'
>>> marxes
['Groucho', 'Haapo']
```


## 3.2.13 index()により要素の値から要素のオフセットを知る方法

要素の値からその要素のリスト内でのオフセットを知りたい場合、index()を使う。

```py
>>> marxes=["Groucho","Choico", 'Haapo',"Zepppo"]
>>> marxes.index("Choico")
1
```


## 3.2.14 inを使った値の有無のテスト
Pythonらしくリストに値があるかどうかをテストするには**in**を使う。

```py
>>> marxes=["Groucho","Choico", 'Haapo',"Zepppo"]
>>> "Groucho" in marxes 
True
>>> "Boss" in marxes 
False
```


## 3.2.15 count()を使った値の個数の計算
特定の値がリスト内に何個含まれているかを数えるには、count()を使う。

```py

>>> marxes=["Groucho","Choico", 'Haapo',"Zepppo","Zepppo"]
>>> "Zepppo" in marxes 
True
>>> marxes=["Groucho","Choico", 'Haapo',"Zepppo","Zepppo"]
>>> marxes.count("Groucho")
1
>>> marxes.count("Boss")
0
>>> marxes.count("Zepppo")
2

```

## 3.2.16 join()による文字列への変換
「join()はsplit()の逆である」と覚えておけば良い

```py

>>> marxes=["Groucho","Choico", 'Haapo']
>>> ",".join(marxes)
'Groucho,Choico,Haapo'
>>> friends=["Harry", "Hermione", "Ron"]
>>> separator=" * "
>>> joined = separator.join(friends)
>>> joined
'Harry * Hermione * Ron'
>>> separated = joined.split(separator)
>>> separated
['Harry', 'Hermione', 'Ron']
>>> separated == joined
True

```

## 3.2.17 sort()による要素の並び替え
- リスト関数のsort()は**その場**でリスト自体をソートする。
- 汎用関数のsorted()はソートされたリストのコピーを返す。

リストの要素が数値ならデフォルトで数値の昇順でソートされる。要素が文字列ならアルファベット順でソートされる。

```py
>>> marxes=["Groucho","Choico", 'Haapo']

#sorted_marxesはコピーであり、これを作ってもオリジナルのリストは変更されない。
>>> sorted_marxes = sorted(marxes)
>>> sorted_marxes
['Choico', 'Groucho', 'Haapo']
>>> marxes
['Groucho', 'Choico', 'Haapo']

#marxesリストからリスト関数sort()を呼び出すとmarxesリスト自体が変更される。
>>> marxes.sort()
>>> marxes
['Choico', 'Groucho', 'Haapo']
>>> numbers = [2,4.5,1,3]
>>> numbers.sort()
>>> numbers
[1, 2, 3, 4.5]
>>> numbers = [2,4.5,1,3]

#デフォルトは昇順であるがreverse=True引数を追加すれば降順になる。
>>> numbers.sort(reverse=True)
>>> numbers
[4.5, 3, 2, 1]
>>> numbers = [2,4.5,1,3]

```

## 3.2.18 len()による長さの取得
len()はリスト内の要素数を返す。

```py
>>> marxes=["Groucho","Choico", 'Haapo']
>>> len(marxes)
3

```

## 3.2.19 =による代入とcopy()によるコピー
一つのリストを複数の変数に代入するとその中の一つでリストを書き換えた時に他のリストも書き換えられる。

```py

>>> a=[1,2,3]
>>> a
[1, 2, 3]
>>> b = a 
>>> b
[1, 2, 3]
>>> a[0]="surprise"
>>> b
['surprise', 2, 3]
>>> a
['surprise', 2, 3]
>>> b[0]="I hate surprises"
>>> b
['I hate surprises', 2, 3]
>>> a
['I hate surprises', 2, 3]

```
bはaと同じリストオブジェクトを参照している。a、bはどちらの名前を使ってリストの内容を書き換えてもその操作は両方に反映される。

次のいずれかの方法を使えばリストを独立の新しいリストにコピーできる。
- リストのcopy()関数
- list()変換関数
- リストスライス

```py
>>> a=[1,2,3]

#b,c,dはaのコピー
>>> b=a.copy()
>>> c=list(a)
>>> d=a[:]
>>> a[0] = "integer lists are boring"
>>> a
['integer lists are boring', 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]


```

#感想
1日引きこもりはしんどい。
明日は昼にでも外に出ようかな。


######参考文献
「Bill Lubanovic著 『入門 Python3』(オライリージャパン発行)」