本文来自异想之旅公开发布的Python教程,原文地址:https://www.yuque.com/yxzl/python
在前面的学习中,我们接触了“存储数据的容器”变量和“存储多个数据的容器”列表。然而在实际的使用中,更多的情况下我们并不在意列表所能提供的数据的有序性,更在意能否快速根据给定的信息查询相关数据:例如根据姓名查询身份证号、根据班级查询学生……
这就需要用到字典这种东西了。
# 本代码以上文提到的“根据姓名查询身份证号”的功能为例
# 我们使用大括号定义一个字典
data = {'小明': '370202xxxxxxxxxxxx', '小红': '620104xxxxxxxxxxxx'}
# 我们使用像访问列表一样的中括号访问字典中的数据
# 例如 data[x] ,其中 x 表示要访问的键,程序会返回对应的值
print(data['小明'])
print(data['小红'])
程序输出:
370202xxxxxxxxxxxx
620104xxxxxxxxxxxx
字典由**键值对(key-value pairs)**构成。格式:{a1: b1, a2: b2, ...}
,其中 a 表示键(key),b 表示值(value),a 与 b 共同组成键值对。
当然,键值对的数据类型不仅仅局限于字符串。键的类型可以是int``float``str``bool
等可哈希且固定的类型,值可以是任意的值或 Python 对象。
名词解释:哈希,……,嗯好吧这个不太好通俗解释,维基百科解释为“一种从任何一种数据中创建小的数字‘指纹’的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。”。其重点一个是“指纹”所表明的唯一性(不重复性),另一个也还是上面说到的确定性。
以上提到的四种类型再加上tuple
几乎是你可以接触到的 Python 内置的所有符合键要求的类型,更多的类型需要手动去定义。
“值可以是任意的值或 Python 对象”这句话并不严谨,事实上包括str
甚至int
等在内,Python 的一切都是对象。具体概念你将在本书的第二部分了解到。
增加和修改的格式一样,直接使用形如dict[key] = value
的语句即可;对于已经存在的键值对,也可以直接当作变量操作,例如dict[key] += 1
。
具体请看如下示例:
child = {'name': 'Yxzl', 'age': 8, 'weight': '25kg'}
# 添加一个新的键值对
child['height'] = '150cm'
# 对已有的键值对的值进行修改
child['age'] += 1
child['weight'] = '30kg'
print(child) # {'name': 'Yxzl', 'age': 9, 'weight': '30kg', 'height': '150cm'}
此处有一个事情需要注意:Python 字典的键值对是不保证有序的。
来看一个示例:
a = {'a': 1, 'b': 2}
print(a['c'])
输出:
Traceback (most recent call last):
File "/path/to/example.py", line 2, in
print(a['c'])
KeyError: 'c'
可以看到,我们访问了a
中不存在的键'c'
,程序运行时抛出了键错误,也就是说通过我们提供的键找不到对应的键值对,自然也找不到对应的值。
在真实的使用中,很多时候我们无法确定字典中是否有我们所查找的值。如果直接使用方括号去访问,程序找不到数据就抛出错误终止程序,这往往并不是我们期望的。因此,Python 提供了一种更优雅的方式来获取字典中的数据:
a = {'a': 1, 'b': 2}
print(a.get('a')) # 输出:1
print(a.get('c')) # 输出:None
print(a.get('c', -1)) # .get()的第二个参数指定找不到对应数值时返回的默认值,输出:-1
这样子即便找不到键值对也不会抛出错误啦,判断键值对是否存在只需要if dict.get(key) is None
即可(关于is
语句的用法将在第二部分面向对象中具体讲解)。
我们可以使用for
循环遍历字典中的键值对。这里我们会用到一个略有不同的语句结构for i, j in ...
,想要真正理解它需要元组相关的知识,我将看心情写在第二部分中,此处还是先作为固定格式记忆好啦。
child = {'name': 'Yxzl', 'age': 8, 'weight': '25kg'}
print('Keys:')
for i in child.keys(): # 遍历字典中的键
print(i)
print()
print('Values:')
for i in child.values(): # 遍历字典中的值
print(i)
print()
print('Key-Value Pairs:')
for i, j in child.items(): # 遍历字典中的键值对
print(i, j)
程序输出:
Keys:
name
age
weight
Values:
Yxzl
8
25kg
Key-Value Pairs:
name Yxzl
age 8
weight 25kg
一看就懂,还是直接上代码~
a = {'a': 1, 'b': 2, 'c': 3}
print(len(a)) # 获取字典的长度(即键值对的个数),输出:3
print(a.pop('a')) # 通过键删除对应的键值对,返回对应键值对的值,输出:1
print(a) # 输出:{'b': 2, 'c': 3}
print('a' in a, 'b' in a) # 判断字典中是否存在某个键,输出:False True
b = {'d': 4, 'e': 5, 'f': 6}
a.update(b) # 合并字典,将b中的键值对更新到a中
print(a) # 输出:{'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
a.clear() # 清空字典
print(a) # 输出:{}