Python辞書

# 辞書型

## python version
```python
Python 3.7.3 (default, Mar 28 2020, 17:59:31) 
[Clang 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

## 用語
### keyとvalue
左側にあるのがkeyで、右側にあるのがvalue。

```python
dict = {"key1" : value, "key2": value2 }
```

# 並び替え
例として、国名と人口を一対一対応させた辞書を考える。

```python
>>> population
{'India': 1380004385, 'China': 1439323776, 'Pakistan': 220892340, 'UnitedStates': 331002651, 'Indonesia': 273523615}
```

人口トップ5の国を適当に並べたときに、「アルファベット順に並べ替えたい」「人口トップはどの国だろう？」という、keyやvalueでソートしたいという作業が必要になる。

## 予備知識

```python
>>> population.items()
dict_items([('India', 1380004385), ('China', 1439323776), ('Pakistan', 220892340), ('UnitedStates', 331002651), ('Indonesia', 273523615)])
```

## sorted
並び替えには2種類あり、keyで並び替えるか、valueで並び替えるか。

```python
# keyをアルファベット順で並べ替える
>>> sorted(population)
['China', 'India', 'Indonesia', 'Pakistan', 'UnitedStates']

# 降順
>>> sorted(population, reverse=True)
['UnitedStates', 'Pakistan', 'Indonesia', 'India', 'China']

# アルファベット順で並べ替え、各リストを返す
>>> sorted(population.items())
[('China', 1439323776), ('India', 1380004385), ('Indonesia', 273523615), ('Pakistan', 220892340), ('UnitedStates', 331002651)]

# valueだけで並び替える（降順にするときは、後述のreverse=Trueオプションを使用）
>>> sorted(population.values())
[220892340, 273523615, 331002651, 1380004385, 1439323776]
```

### ラムダ関数を用いる
```python
# 辞書をkeyでソートする
>>> sorted(population.items(), key = lambda x : x[0])
[('China', 1439323776), ('India', 1380004385), ('Indonesia', 273523615), ('Pakistan', 220892340), ('UnitedStates', 331002651)]

# 辞書のvalueでソートする
>>> sorted(population.items(), key = lambda x : x[1])
[('Pakistan', 220892340), ('Indonesia', 273523615), ('UnitedStates', 331002651), ('India', 1380004385), ('China', 1439323776)]
```

### 二次元辞書

次に、辞書のvalueがさらにリストであるような型を考える（この例の場合、第一成分が総人口、第二成分は年変化率）。

```python
>>> population
{'India': [1380004385, 0.99], 'China': [1439323776, 0.39], 'Pakistan': [220892340, 2.0], 'UnitedStates': [331002651, 0.59], 'Indonesia': [273523615, 1.07]}
```

```python
# 辞書keyで並び替え
>>> sorted(population.items(), key = lambda x : x[0] )
[('China', [1439323776, 0.39]), ('India', [1380004385, 0.99]), ('Indonesia', [273523615, 1.07]), ('Pakistan', [220892340, 2.0]), ('UnitedStates', [331002651, 0.59])]

# 辞書value第一成分で並び替え
>>> sorted(population.items(), key = lambda x: x[1][0], reverse=True )
[('China', [1439323776, 0.39]), ('India', [1380004385, 0.99]), ('UnitedStates', [331002651, 0.59]), ('Indonesia', [273523615, 1.07]), ('Pakistan', [220892340, 2.0])]
## --> 中国、インド、アメリカ、インドネシア、パキスタンの順に人口が多いことがわかる

# 辞書value第二成分で並び替え
>>> sorted(population.items(), key = lambda x: x[1][1], reverse=True )
[('Pakistan', [220892340, 2.0]), ('Indonesia', [273523615, 1.07]), ('India', [1380004385, 0.99]), ('UnitedStates', [331002651, 0.59]), ('China', [1439323776, 0.39])]
## --> パキスタン、インドネシア、インド、アメリカ、中国の順に年増加率が高いことがわかる
```

ラムダ式の`x[1][0]`や`x[1][1]`が少しややこしいかもしれない。

```python
>>> population.items()
dict_items([('India', [1380004385, 0.99]), ('China', [1439323776, 0.39]), ('Pakistan', [220892340, 2.0]), ('UnitedStates', [331002651, 0.59]), ('Indonesia', [273523615, 1.07])])
```

を見ればわかるように、`x[1]`で用意した辞書のvalueを表現し、次に`x[1][0]`でvalueの第０番目の値を使うということを言っているのである。