# 哈希散列
字典准确地来说是一种映射数据结构,也就是哈希表,或者称为散列表。注意,所有不可变数据类型都可以作为散列表的键,不可变数据类型有str、type和tuple。但是如果tuple中含有可变数据类型的索引,那么该数据类型不可作为散列表的键。
# 字典构造方法
```python
a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
a == b == c == d == e
>>>True
```
# 字典推导(dict comprehension)
字典推导跟列表推导的使用方法差不多,并且这种推导构造方法还蔓延到其他数据结构上。
```python
DIAL_CODES = [(86, 'China'), (91, 'India'), (1, 'Unite States'), (7, 'Russia')]
country_code = {country: code for code, country in DIAL_CODES}
code_country = {code: country.upper() for country, code in country_code.items() if code > 1}
```
# 常见映射方法
dict、defaultdict和OrderedDict,后两个数据类型是dict的变种,位于collections模块下。
| 方法 | dict | defaultdict | OrderedDict | 描述 |
| ---------------------------- | ---- | ----------- | ----------- | ------------------------------------------------------------ |
| `d.clear()` | y | y | y | 移除所有元素 |
| `d.__contains__(k)` | y | y | y | 检查元素k是否在字典对象d中 |
| `d.copy()` | y | y | y | 浅复制 |
| `d.__copy__()` | | y | | `copy.copy()` |
| `d.default_factory()` | | y | | 在`__missing__`函数中被调用,给未找到的元素设置默认值 |
| `d.__delitem__(k)` | y | y | y | `del d[k]`移除键为k的元素 |
| `d.fromkeys(it, [initial])` | y | y | y | 将迭代器it中元素设为映射里的键,如果有initial参数,就把它作为这些键对应的值,默认为None |
| `d.get(k, [default])` | y | y | y | 返回键k对应的值,如果不存在键k,则返回None或者default |
| `d.__getitem__(k)` | y | y | y | `d[k]`返回键为k的值 |
| `d.items()` | y | y | y | 返回d所有的键值对 |
| `d.__iter__()` | y | y | y | 返回键的迭代器 |
| `d.keys()` | y | y | y | 返回所有键 |
| `d.__len__()` | y | y | y | `len(d)`返回键值对的数量 |
| `d.__missing__(k)` | | y | | 当`__getitem__`找不到对应键时候,方法被调用 |
| `d.move_to_end(k, [last])` | | | y | 把键为k的元素移动到最靠前或者最靠后的位置,last默认值为True |
| `d.pop(k, [default])` | y | y | y | 返回键k对应的值,并且移除该键值对。如果不存在k,则返回None或者default |
| `d.popitem()` | y | y | y | 随机返回一个键值对,并且移除该键值对。 |
| `d.__reversed__()` | | | y | 返回倒序的键的迭代器 |
| `d.setdefault(k, [default])` | y | y | y | 如果字典里有键k,返回该值,并且把它设置为default值;如果没有键k,则让`d[k]=default`,并返回default值。 |
| `d.__setitem__(k, v)` | y | y | y | `d[k]=v`,设置k键的值为v |
| `d.update(m, [**kargs])` | y | y | y | m可以是映射或者键值对迭代器,用来更新d |
| `d.values()` | y | y | y | 返回字典里所有的值 |