【Python3の基本】リスト・辞書の使い方まとめ

<h1>list() について</h1>
<p>リストをa=[1,2,3,4,5]のように指定できることはご存知でしょう。<p>
<p>今回は、リストの中にリストを作ってみる。<p>

```py
a=['あ','い','う','え','お']
ka=['か','き','く','け','こ']
sa=list("さしすせそ")
ta=list('たちつてと')
na=list('なにぬねの')
ha=list('はひふへほ')
ma=list('まみむめも')
ya=list('や　ゆ　よ')
ra=list('らりるれろ')
wa=list('わ　を　ん')
```

<p>とりあえず、ひらがな五十音をそれぞれあ行から、ワ行までリストを作った。<p>
<p>ちなみに、list('かきくけこ')と['か','き','く','け','こ']<p>
<p>は同じ意味を持つ。<p>
<p>ここで、これらをまとめたリストを作成する<p>

```py
hiragana1=[a,ka,sa,ta,na,ha,ma,ya,ra,wa]
hiragana2=list(a+ka+sa+ta+na+ha+ma+ya+ra+wa)
```

<p>この二つのリストの違いはわかるだろうか<p>
<p>hiragana1は、リストをリストにしている。<p>
<p>hiragana2は、リストをまとめている。<p>

<pre>print(hiragana1)
[['あ', 'い', 'う', 'え', 'お'], ['か', 'き', 'く', 'け', 'こ'], ['さ', 'し', 'す', 'せ', 'そ'], ['た', 'ち', 'つ', 'て', 'と'], ['な', 'に', 'ぬ', 'ね', 'の'], ['は', 'ひ', 'ふ', 'へ', 'ほ'], ['ま', 'み', 'む', 'め', 'も'], ['や', ' ', 'ゆ', ' ', 'よ'], ['ら', 'り', 'る', 'れ', 'ろ'], ['わ', ' ', 'を', ' ', 'ん']]

print(hiragana2)
['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', ' ', 'ゆ', ' ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', ' ', 'を', ' ', 'ん']
</pre>

<p>どちらが使いやすいかは、状況によって異なると思うけど、hiragana1はまとまりがあってわかりやすい。<p>
<p>ここで、さ行のsu<p>
<p>「す」を取り出したい時には、<p>

```py
print(hiragana1[2][2])
```

<p>このように記述する。<p>
<div class="caution">
しつこいようだが、リストの順番は0から1番目となる。
</div>
<p>リストの中身を書き換えたい時は、直接していてあげれば良い<p>

```py
a[0]= "阿"
print(a)
```

<pre>['阿', 'い', 'う', 'え', 'お']
</pre>
<h2>リストに要素を追加する</h2>
<p>リストに要素を追加したい時は、append() を用いる。<p>

```py
ka.append('が')
print(ka)
```

<pre>['か', 'き', 'く', 'け', 'こ', 'が']
</pre>

<p>ちなみに、リストをappend() すると、リストにリストが追加される。<p>

```py
sa.append(ta)

['さ', 'し', 'す', 'せ', 'そ', ['た', 'ち', 'つ', 'て', 'と']]
```

<p>inset() を使うと、最後尾ではなく指定のポジションに要素を追加することができる。<p>

```py
a.insert(2,"ゐ")
print(a)
```

<pre>['阿', 'い', 'ゐ', 'う', 'え', 'お']
</pre>
<p>del を使えば、**リストから要素を削除**することができる。<p>

```py

del a[1]
print(a)

```

<pre>['阿', 'ゐ', 'う', 'え', 'お']
</pre>

<p>例えば<p>
<p>「く」が「か行」にあるが、何番目にあるかわからない場合、remove() を使って消すことができる。<p>

```py
ka.remove("く")
print(ka)
```

<pre>['か', 'き', 'け', 'こ', 'が']
</pre>
<h2>要素の在処をさぐる</h2>
<p>「く」のように、どこにあるのかわからない場合、index() を使うことで何番目にあるのか知ることができる。<p>

```py
#サ行の「せ」を探す。
print(sa.index('せ'))

3
```

<p>しつこいようだが、3＝4番目ということだ<p>
<p>しかし、「せ」を探して「た行」を当たってしまった場合、怒られてしまう。<p>
<p>いちいちエラーになっててはしょうがないので、こういう時、in を使って、True Falseのブール値を割り出す。<p>

```py
"せ" in ta

False
```

<p>Falseが帰ってきたので、「せ」はた行になかった。<p>
<p>では、hiraganaリストの中に「せ」が存在するのか、調べたい時にhiragana1かhiragana2どちらを使えば良いだろう？<p>
<p>答えは、hiragana2。こちらはすべての文字が一つずつリストになっているので、Trueが帰ってくる。<p>

```py
"せ" in hiragana2

True
```

<p>しかし、hiragana1で探すと、Falseが帰ってくる。<p>

```py
"せ" in hiragana1

False
```

<p>これは、hiragana1に「せ」というリストが存在しないから。「さしすせそ」というリストが認識されているためだ。<p>
<p>場合によってhiragana1とhiragana2を使い分けるとは、このことである。<p>
<p>というわけで、よくわからないものをリスト化して持ってきた場合、まず「in」を使って存在の有無を調べ、<p>
<p>次にindex() でそれがどこに存在するのか知るというのが真っ当な手順になる。<p>
<h2>個数の割り出し</h2>
<p>リストに同じ文字がいくつ含まれているのかを知るには、count() を使う。<p>

```py
print(hiragana2.count(" "))

4
```

<p>上記は、hiragana2に空白がいくつ含まれているか調べた。や行とわ行に2つずつあるので4とかえってきた。<p>
<h2>文字列への変換</h2>
<p>リストを文字列に変換するには、join() を用いる。<p>

```py
print(','.join(hiragana2))

あ,い,う,え,お,か,き,く,け,こ,さ,し,す,せ,そ,た,ち,つ,て,と,な,に,ぬ,ね,の,は,ひ,ふ,へ,ほ,ま,み,む,め,も,や, ,ゆ, ,よ,ら,り,る,れ,ろ,わ, ,を, ,ん

#こいつを綺麗にあ〜んまで並べたい時はさらに
print(','.join(hiragana2).replace(',','').replace(' ',''))

あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん
```

<h2>ソート</h2>
<p>なんとソート機能まである。<p>
<p>sorted(リスト)とするだけ。これで昇順になる。はたして、ひらがなはうまくいくだろうか。<p>
<p>一度最初の綺麗なあいうえお順にもどして、ばらばらに行を並べたhiragana3を作って試してみよう<p>

```py
hiragana3=sa+a+na+ka+wa+ta+ra+ma+ya+ha
print(sorted(hiragana3))

[' ', ' ', ' ', ' ', 'あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', 'ゆ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'を', 'ん']
```

<p>綺麗にならんだ！<p>
<p>ここでわかったのは、空白文字の方が優先順位が高いことだ。（どうでもいい）<p>
<p>もうひとつ、sort() を使うことができる。これは、リストそのものを書き換える。<p>

```py
hiragana3.sort()
print(hiragana3)

[' ', ' ', ' ', ' ', 'あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', 'ゆ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'を', 'ん']
```

<div class="caution">
print(hiragana3.sort())としても、Noneとしか帰ってこない。
</div>
<h1>辞書</h1>
<p>辞書（dictionary）はリストに似ているが<p>
<p>{key:値}のペアでリスト化されている。<p>
<p>それぞれのキーを参照すると、値が出てくるといった感じだ。<p>

```py
student={'小学生':'6-12歳','中学生':'13-15歳','高校生':'16-18歳','大学生':'18-22歳'}
```

<p>これは、小学生から大学生までの年齢を辞書に収めていることを示す。<p>
<p>まぁ僕みたいに2年も3年も回り道している人はズレてしまうけど。<p>

```py
#中学生の年齢を知りたい時print(student['中学生'])
print(student['中学生'])
```

<p>では、この辞書に大学生が存在しているのか知りたい時は、<p>

```py
'大学生' in student
```

<p>とすればよいが、ここで問題。<p>
<h1 class="quiz">練習問題</h1>
<div class="quiz">
大学生が辞書に含まれている時にその年齢も出してくれるプログラムを書きなさい。
</div>
<h1 class="answer">解答</h1>
<div class="answer">

```py
if '大学生' in student:
    print(student['大学生'])
else:
    print('見つかりませんでした')
```

</div>
<p>大切なのは、見つからなかった場合のelseもちゃんと書くこと。<p>
<p>ここで、大学生の年齢を18-24に広げたいとする。<p>
```py
student['大学生']="18-24"
print(student['大学生'])

18-24
```

<p>これでちゃんと書き換えられている。<p>
<h2>辞書同士の結合</h2>
<p>大学院生 23-24、博士 25-28を加えたいとする。<p>
<p>over_student={'大学院生':'23-24','博士':'25-28'}<p>
<p>とすることで、追加の辞書を作成する。ここに、**update()** 関数を使ってstudentに加えてあげよう<p>

```py
student.update(over_student)
print(student)

{'高校生': '16-18歳', '中学生': '13-15歳', '大学生': '18-22歳', '小学生': '6-12歳', '博士': '25-28', '大学院生': '23-24'}
```

<p>これで無事、大学院生と博士がstudentの仲間入りを果たすことができた。<p>
<p>ここから、*やっぱり博士はいらないや★*と考える人がいたら、delを使って、同じように削除することができる。<p>

```py
del student['博士']
print(student)

{'高校生': '16-18歳', '中学生': '13-15歳', '大学生': '18-22歳', '小学生': '6-12歳', '大学院生': '23-24'}
```

<p>全てを消し去りたい時は、clear() 関数をつかう。<p>

```py
student.clear()
print(student)

{}
```

<h2>キーの取得</h2>
<p>辞書にどんなキーが含まれているのかわからなければ、その辞書は使い物にならない。<p>
<p>そんな時に使うのが、keys() 関数だ。keyではない、keysだ<p>

```py
#over_studentを加えたstudent辞書を使う
print(student.keys())

dict_keys(['高校生', '中学生', '大学生', '小学生', '博士', '大学院生'])
```

<p>これで、どんなキーが含まれているのか知ることができた（なんで大学院生が後に来てるんだろう）<p>
<p>このkeys() によって出したキーはlist() で囲むことによってリスト化することができる。<p>
<h2>全ての値の取得</h2>
<p>キーとは反対に値を知りたい時、values<p>
<p>を使うことで調べることができる。<p>

```py
student.values()

dict_values(['16-18歳', '13-15歳', '18-22歳', '6-12歳', '25-28', '23-24'])
```
<p>さらに、キーと値のセットを調べたい時は、items() を使う。<p>

```py
student.items()

dict_items([('高校生', '16-18歳'), ('中学生', '13-15歳'), ('大学生', '18-22歳'), ('小学生', '6-12歳'), ('博士', '25-28'), ('大学院生', '23-24')])
```
<p>本日はこれにて終了。<p>