<jupyter_start><jupyter_text>字典  字典 `dictionary` ，在一些编程语言中也称为 `hash` ， `map` ，是一种由键值对组成的数据结构。顾名思义，我们把键想象成字典中的单词，值想象成词对应的定义，那么——一个词可以对应一个或者多个定义，但是这些定义只能通过这个词来进行查询。  基本操作  空字典 **Python** 使用 `{}` 或者 `dict()` 来创建一个空的字典：<jupyter_code>a = {}
type(a)
a = dict()
type(a)<jupyter_output><empty_output><jupyter_text>有了dict之后，可以用索引键值的方法向其中添加元素，也可以通过索引来查看元素的值：  插入键值<jupyter_code>a["one"] = "this is number 1"
a["two"] = "this is number 2"
a<jupyter_output><empty_output><jupyter_text>查看键值<jupyter_code>a['one']<jupyter_output><empty_output><jupyter_text>更新键值<jupyter_code>a["one"] = "this is number 1, too"
a<jupyter_output><empty_output><jupyter_text>初始化字典 可以看到，Python使用`key: value`这样的结构来表示字典中的元素结构，事实上，可以直接使用这样的结构来初始化一个字典：<jupyter_code>b = {'one': 'this is number 1', 'two': 'this is number 2'}
b['one']<jupyter_output><empty_output><jupyter_text>字典没有顺序 当我们 `print` 一个字典时，**Python**并不一定按照插入键值的先后顺序进行显示,因为字典中的键本身不一定是有序的。<jupyter_code>print a
print b<jupyter_output>{'two': 'this is number 2', 'one': 'this is number 1'}<jupyter_text>因此，**Python**中不能用支持用数字索引按顺序查看字典中的值，而且数字本身也有可能成为键值，这样会引起混淆：<jupyter_code># 会报错
a[0]<jupyter_output><empty_output><jupyter_text>键必须是不可变的类型 出于hash的目的，Python中要求这些键值对的**键**必须是**不可变**的，而值可以是任意的Python对象。一个表示近义词的字典：<jupyter_code>synonyms = {}
synonyms['mutable'] = ['changeable', 'variable', 'varying', 'fluctuating',
                       'shifting', 'inconsistent', 'unpredictable', 'inconstant',
                       'fickle', 'uneven', 'unstable', 'protean']
synonyms['immutable'] = ['fixed', 'set', 'rigid', 'inflexible', 
                         'permanent', 'established', 'carved in stone']
synonyms<jupyter_output><empty_output><jupyter_text>另一个例子：<jupyter_code># 定义四个字典
e1 = {'mag': 0.05, 'width': 20}
e2 = {'mag': 0.04, 'width': 25}
e3 = {'mag': 0.05, 'width': 80}
e4 = {'mag': 0.03, 'width': 30}
# 以字典作为值传入新的字典
events = {500: e1, 760: e2, 3001: e3, 4180: e4}
events<jupyter_output><empty_output><jupyter_text>键（或者值）的数据类型可以不同：<jupyter_code>people = [
    {'first': 'Sam', 'last': 'Malone', 'name': 35},
    {'first': 'Woody', 'last': 'Boyd', 'name': 21},
    {'first': 'Norm', 'last': 'Peterson', 'name': 34},
    {'first': 'Diane', 'last': 'Chambers', 'name': 33}
]
people<jupyter_output><empty_output><jupyter_text>使用 dict 初始化字典 除了通常的定义方式，还可以通过 `dict()` 转化来生成字典：<jupyter_code>inventory = dict(
    [('foozelator', 123),
     ('frombicator', 18), 
     ('spatzleblock', 34), 
     ('snitzelhogen', 23)
    ])
inventory<jupyter_output><empty_output><jupyter_text>利用索引直接更新键值对：<jupyter_code>inventory['frombicator'] += 1
inventory<jupyter_output><empty_output><jupyter_text>适合做键的类型 在不可变类型中，整数和字符串是字典中最常用的类型；而浮点数通常不推荐用来做键，原因如下：<jupyter_code>data = {}
data[1.1 + 2.2] = 6.6
# 会报错
data[3.3]<jupyter_output><empty_output><jupyter_text>事实上，观察`data`的值就会发现，这个错误是由浮点数的精度问题所引起的：<jupyter_code>data<jupyter_output><empty_output><jupyter_text>有时候，也可以使用元组作为键值，例如，可以用元组做键来表示从第一个城市飞往第二个城市航班数的多少：<jupyter_code>connections = {}
connections[('New York', 'Seattle')] = 100
connections[('Austin', 'New York')] = 200
connections[('New York', 'Austin')] = 400<jupyter_output><empty_output><jupyter_text>元组是有序的，因此 `('New York', 'Austin')` 和 `('Austin', 'New York')` 是两个不同的键：<jupyter_code>print connections[('Austin', 'New York')]
print connections[('New York', 'Austin')]<jupyter_output>200
400<jupyter_text>字典方法   `get` 方法 之前已经见过，用索引可以找到一个键对应的值，但是当字典中没有这个键的时候，Python会报错，这时候可以使用字典的 `get` 方法来处理这种情况，其用法如下：    `d.get(key, default = None)`返回字典中键 `key` 对应的值，如果没有这个键，返回 `default` 指定的值（默认是 `None` ）。<jupyter_code>a = {}
a["one"] = "this is number 1"
a["two"] = "this is number 2"<jupyter_output><empty_output><jupyter_text>索引不存在的键值会报错：<jupyter_code>a["three"]<jupyter_output><empty_output><jupyter_text>改用get方法：<jupyter_code>print a.get("three")<jupyter_output>None<jupyter_text>指定默认值参数：<jupyter_code>a.get("three", "undefined")<jupyter_output><empty_output><jupyter_text>`pop` 方法删除元素 `pop` 方法可以用来弹出字典中某个键对应的值，同时也可以指定默认参数：    `d.pop(key, default = None)`删除并返回字典中键 `key` 对应的值，如果没有这个键，返回 `default` 指定的值（默认是 `None` ）。<jupyter_code>a<jupyter_output><empty_output><jupyter_text>弹出并返回值：<jupyter_code>a.pop("two")
a<jupyter_output><empty_output><jupyter_text>弹出不存在的键值：<jupyter_code>a.pop("two", 'not exist')<jupyter_output><empty_output><jupyter_text>与列表一样，`del` 函数可以用来删除字典中特定的键值对，例如：<jupyter_code>del a["one"]
a<jupyter_output><empty_output><jupyter_text>`update`方法更新字典 之前已经知道，可以通过索引来插入、修改单个键值对，但是如果想对多个键值对进行操作，这种方法就显得比较麻烦，好在有 `update` 方法：    `d.update(newd)`将字典`newd`中的内容更新到`d`中去。<jupyter_code>person = {}
person['first'] = "Jmes"
person['last'] = "Maxwell"
person['born'] = 1831
print person<jupyter_output>{'born': 1831, 'last': 'Maxwell', 'first': 'Jmes'}<jupyter_text>把'first'改成'James'，同时插入'middle'的值'Clerk'：<jupyter_code>person_modifications = {'first': 'James', 'middle': 'Clerk'}
person.update(person_modifications)
print person<jupyter_output>{'middle': 'Clerk', 'born': 1831, 'last': 'Maxwell', 'first': 'James'}<jupyter_text>`in`查询字典中是否有该键<jupyter_code>barn = {'cows': 1, 'dogs': 5, 'cats': 3}<jupyter_output><empty_output><jupyter_text>`in` 可以用来判断字典中是否有某个特定的键：<jupyter_code>'chickens' in barn
'cows' in barn<jupyter_output><empty_output><jupyter_text>`keys` 方法，`values` 方法和`items` 方法     `d.keys()` 返回一个由所有键组成的列表；    `d.values()` 返回一个由所有值组成的列表；    `d.items()` 返回一个由所有键值对元组组成的列表；<jupyter_code>barn.keys()
barn.values()
barn.items()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.18397017707362534, 'fraction_numerical': 0.020130475302889098, 'mean_word_length': 9.646825396825397, 'pattern_counts': {'":': 0, '<': 112, '<?xml version=': 0, '>': 112, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '29', 'dir': 'jupyter-structured-clean-dedup', 'id': '475334', 'license': 'MIT', 'n_tokens_mistral': 2976, 'n_tokens_neox': 2992, 'n_words': 296, 'path': 'lijin-THU:notes-python/02-python-essentials/02.10-dictionaries.ipynb', 'repo_name': 'Maecenas/python-getting-started', 'size': '5365'}