零基础学python 第四章 字典

字典的用途

按照键来保存值。
键可以是任何不可变值,如字符串、元组等都可以。
值可以是我们知道的,如字符串、元组、序列、字典,甚至函数、类等等。
字典应该是初学者最喜欢用的数据结构之一,一般我们使用字符串做键就够用了。

创建和使用

直接使用花括号定义即可。

>>> 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()打印出来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值