注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。
字典类型定义
字典(dict)是Python基础数据类型中仅有的一种标准映射类型。
所谓映射,是一种键(索引)和值(数据)的对应。映射可以参考数学函数y=f(x),键对应x,值对应y。一个键(x)只能对应一个值(y),而一个值(y)可以对应多个键(x)。
键值对:键是数据索引index的扩展。
字典是键值对的集合,每一对键值对之间是无序的。
字典采用大括号{}和dict()来创建,键值对之间用冒号:连接。
{<key1>:<value1>, <key2>:<value2>,...,<keyn>:<valuen>}
字典的创建和访问
创建字典的2种方法:
student = {}
student = dict()
在字典中,通过键获得值。
字典的键必须是不可变数据类型,如int/string/tuple,float也可以,但官方不推荐。因为float在计算机的存储和表示只是近似值,用它作键可能产生一些意外情况而会导致数据不安全。
创建字典时,如果相同键对应不同值,字典采用最后(最新)一个"键值对"。如下所示:
d = {'a': 1, 'b': 2, 'b': '3'}
print(d['b'])
<<<3
标签收纳盒
如果说列表和元组可以看作是数据收纳盒的话,字典则可以被视为标签收纳盒。类比元组和列表,字典的标签是键,就相当于它们的索引。
字典中保存的各个数据值key-value键值对。
使用.fromkeys()来进行批量添加操作,若没有指定值,则值默认为None。
student = dict.fromkeys(("name", "age"))
student
Out[15]: {'name': None, 'age': None}
字典的键(key)需是不可变类型的数据,如int/string/tuple,float也可以,但官方不推荐。
字典的操作
更新字典用.update()方法。
不同于列表,字典添加元素是没有append()方法的,若是要往字典里添加元素,可以使用d[k] = value,即定义新键值对的方法来修改或添加元素。
d1 = {1: 1, 2: 2}
d2 = {3: 3}
d1.update(d2)
d1
Out[19]: {1: 1, 2: 2, 3: 3}
d1.update(a='agc')
d1
Out[28]: {1: 1, 2: 2, 3: 3, 'a': 'agc'}
d1['b'] = 'kkkk'
d1
Out[30]: {1: 1, 2: 2, 3: 3, 'a': 'agc', 'b': 'kkkk'}
缩减字典的方法:
del操作——del d[key]将 d[key] 从 d 中移除。 如果映射中不存在 key 则会引发 KeyError。
pop操作——.pop(key[, default])。如果 key 存在于字典中则将其移除并返回其值,否则返回 default。 如果 default 未给出且 key 不存在于字典中,则会引发 KeyError。
.popitem()——从字典中移除并返回一个 (键, 值) 对。 键值对会按 LIFO 的顺序被返回(也就是每次都在字典的最尾端移除键值对)。popitem() 适用于对字典进行消耗性的迭代,这在集合算法中经常被使用。如果字典为空,调用 popitem() 将引发 KeyError。在 3.7 版更改: 现在会确保采用 LIFO 顺序。 在之前的版本中,popitem() 会返回一个任意的键/值对。
[28]: d1
Out[28]: {1: 1, 2: 2, 3: 3, 'a': 'agc'}
del d1[1]
d1.pop(2) #删除键为2的键值对(数据项),并返回该数据项的值。
Out[30]: 2
d1
Out[31]: {3: 3, 'a': 'agc'}
d1.clear() #一次性清空字典里所有的键值对,把字典变为空字典。
d1
Out[33]: {}
字典不再是无序的
长期以来,Python中的字典都是无序的,但Python 3.7之后,这种情况已有所改变。尽管对字典进行访问时依然要使用键来操作,但如果要对字典进行添加或移除其中元素的操作,那么添加和移除的元素在字典中的排序不再是随机的,而是根据LIFO(即后进先出)的原则:无论是新增元素还是移除元素,都会发生在字典的尾部,而不是以前的随机位置。
#.popitem()的使用实例:按照LIFO后进先出的原则,从字典尾端开始移除数据项。
d = {"one": 1, 'jack': 4098, 'sjoerd': 4127, "two": 2, "three": 3}
d.popitem()
Out[43]: ('three', 3)
d.popitem()
Out[44]: ('two', 2)
d1
Out[28]: {1: 1, 2: 2, 3: 3, 'a': 'agc'}
d1['b'] = 'kkkk' # 新增的元素会自动添加至字典的尾部。
d1
Out[30]: {1: 1, 2: 2, 3: 3, 'a': 'agc', 'b': 'kkkk'}
两个字典的比较当且仅当它们具有相同的 (键, 值) 对时才会相等(不考虑顺序)。 排序比较 ('<', '<=', '>=', '>') 会引发 TypeError。
To be continued.