字典的用途
按照键来保存值。
键可以是任何不可变值,如字符串、元组等都可以。
值可以是我们知道的,如字符串、元组、序列、字典,甚至函数、类等等。
字典应该是初学者最喜欢用的数据结构之一,一般我们使用字符串做键就够用了。
创建和使用
直接使用花括号定义即可。
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
>>> empty_dict = {}
或者使用dict函数定义
>>> phonebook = dict([('Alice', '2341'), ('Beth', '9102'), ('Cecil', '3258')]}
>>> empty_dict = dict()
可以通过键值直接访问。
>>> phonebook['Alice']
'2341
列表的元素是有顺序的,但是字典元素是没有顺序的
怎么验证呢?
- 可以使用 == 来判断两个列表是否相等
- 可以使用 == 来判断两个字典是否相等
- 对调整了元素顺序列表进行比较,对调整了元素顺序的字典进行比较,得出“列表的元素有顺序,字典的元素没有顺序”的结论
验证代码如下:
>>> a = [1, 2, 3]
>>> b = [1, 3, 2]
>>> c = [1, 2, 3]
>>> a == b
False
>>> a == c
True
>>> a = {'a':'aa', 'b':'bb'}
>>> b = {'a':'aa', 'b':'bb'}
>>> c = {'b': 'bb', 'a':'aa'}
>>> a == b
True
>>> a == c
True
基本的字典操作
- len(d)返回字典d包含的项(键值对)数
使用len()函数读取字典的大小是我们常做的操作 - d[k]返回与键k相关联的值
- d[k] = v将值v关联到键k
- del d[k]删除键为k的项。
- k in d检查字典d是否包含键为k的项
>>> phonebook = {}
>>> phonebook['Alice'] = '2341'
>>> phonebook['Beth'] = '9102'
>>> phonebook['Cecil'] = '3258'
>>> phonebook
{'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
>>> len(phonebook)
3
>>> del phonebook['Beth']
>>> phonebook
{'Alice': '2341', 'Cecil': '3258'}
为了说明in的使用,这里提前说一下if语句。if后面是一个语句,如果改语句为真时,执行它的内容,否则直接跳过。
>>> if 'Alice' in phonebook:
>>> print("Alice is exist")
'Alice is exist'
字典方法
clear()
字典内部有数据时,使用该成员方法,可以清除字典内的数据。
>>> var = {'a':'abc', 'b':'bcd'}
>>> var
{'a': 'abc', 'b': 'bcd'}
>>> var.clear()
>>> var
{}
items()
这里提前说明一下,for…in… 关键字用于遍历一个序列或者字典等可迭代的数据结构。
- 以:号分割关键字行
- 以缩进定义语句体
想遍历一个字典里的所有值,直接以下代码,你会发现不是你想要的。
>>> var = {'a': 'abc', 'b': 'bcd', 'c': 'cde'}
>>> for var_item in var:
... print(var_item)
...
a
b
c
这样得到的好像只有键值,那么我们可以通过键值取到键对应的值,然后就可以实现遍历了
>>> for var_item in var:
... print(var_item)
... print(var[var_item])
...
a
abc
b
bcd
c
cde
这样写代码好像也是可以的,不过我们一般使用items()成员函数:
>>> for var_item in var.items():
... print(var_item)
... print(var_item[0])
... print(var_item[1])
...
('a', 'abc')
a
abc
('b', 'bcd')
b
bcd
('c', 'cde')
c
cde
如果我们直接拆包使用可能会更爽,看上去“更专业”,如下。
>>> for key, value in var.items():
... print(key)
... print(value)
...
a
abc
b
bcd
c
cde
setdefault()
设置字典的默认值,可以连续操作。
由于我们需要处理的数据可能各种各样,key和顺序都是无法预先写好的。如果不用setdefault()函数,想实现给一个字典d的字典元素key1的值增加 ‘key1_1’: ‘value1_1’和’key1_2’:‘value1_2’, 且以不同时机来实现这个赋值。我们构造两个函数分别赋值,两个函数可以调整先后执行,得到同样的结果。需要得到的结果:
d = {'key1': {'key1_1': 'value1_1', 'key1_2': 'value1_2'}}
如果我们不用本成员函数 setdefault(),代码如下:
>>> d={} # 在定义时不知道将来会有哪些键
>>> def set_key1_1():
>>> d['key1'] = {}
>>> d['key1']['key1_1'] = 'value1_1'
>>>
>>> def set_key1_2():
>>> d['key1']['key1_2'] = 'value1_2'
>>>
>>> set_key1_1()
>>> set_key1_2()
>>> d
{'key1': {'key1_1': 'value1_1', 'key1_2': 'value1_2'}}
好像上面的代码是正确的,其实不然。如果把调用 set_key1_1()和set_key1_2()的顺序对调一下,得到的结果如下:
>>> set_key1_2()
>>> set_key1_1()
>>> d
{'key1': {'key1_1': 'value1_1'}}
不过也有一个办法可以解决这个问题,如下代码:
>>> d={} # 在定义时不知道将来会有哪些键
>>> def set_key1_1():
>>> if 'key1' not in d:
>>> d['key1'] = {}
>>> d['key1']['key1_1'] = 'value1_1'
>>>
>>> def set_key1_2():
>>> if 'key1' not in d:
>>> d['key1'] = {}
>>> d['key1']['key1_2'] = 'value1_2'
>>>
>>> set_key1_1()
>>> set_key1_2()
>>> d
{'key1': {'key1_1': 'value1_1', 'key1_2': 'value1_2'}}
如果使用 setdefault()函数,就会大大简化代码。实现函数 set_key1_1()代码如下:
>>> def set_key1_2():
>>> d.setdefault('key1', {})['key1_2'] = 'value1_2'
完整的代码,可以自己练习。
update()
把另一个字典合入进来,如果键值一样的,会覆盖原有的值。
>>> dict1 = {'key1': 'value1'}
>>> dict2 = {'key2': 'value2'}
>>> dict1.update(dict2)
>>> dict1
{'key1': 'value1', 'key2': 'value2'}
>>> dict3 = {'key2': 'value3'}
>>> dict1.update(dict3)
>>> dict1
{'key1': 'value1', 'key2': 'value3'}
练习题
- 请定义一个全局变量 student_score, 类型为字典
- 请定义一个函数,函数名为 save_student_name,该函数有参数student_id, name表示学号和姓名,该函数把两个参数传入的值保存到student_score中。
- 请定义一个函数,函数名为 save_student_score,该函数有参数student_id, score表示学号和分数,该函数把两个参数传入的值保存到student_score中。
- 以sutdent_id为关键字保存学生的姓名和分数,相同的student_id的姓名和分数要保存在这个student_id为关键字的值中。
- 调用 save_student_name()函数保存以下名字:(‘123123’,‘zhangsan’), (‘123124’,‘lisi’),(‘123125’, ‘wangwu’)
- 调用save_student_score()函数保存以下分数:(‘123123’,‘85’), (‘123124’,‘90’),(‘123125’, ‘88’)
- 最后把student_score的数据使用print()打印出来