0%

第六章 字典

6.1 一个简单的字典

1
2
3
human_0 = {'name' : 'zhangsan', 'age' : 24}
print(human_0['name'])
print(human_0['age'])

输出结果为:

1
2
zhangsan
24

6.2 使用字典

在Python中,字典是一系列键值对。每个都与一个值相关联,可使用键来访问相关联的值。与键相关联的值可以是数、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。

在Python中,字典用放在花括号({})中的一系列键值对表示。键值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键值对之间用逗号分隔。

6.2.1 访问字典中的值

要获取与键相关联的值,可依次指定字典名和放在方括号内的键

1
2
3
student_1 = {'name' : 'lisi', 'age' : 25}
print(student_1['name'])
print(student_1['age'])

输出结果为:

1
2
lisi
25

6.2.2 添加键值对

字典一种动态结构,可随时在其中添加键值对。要添加键值对,可依次指定字典名、用方括号括起的键和相关联的值。

1
2
3
4
student_1 = {'name' : 'lisi', 'age' : 25}
print(student_1)
student_1['height'] = 175
print(student_1)

输出结果为:

1
2
{'name' : 'lisi', 'age' : 25}
{'name' : 'lisi', 'age' : 25, 'height' : 175}

在Python3.7中,字典中元素的排列顺序与定义时相同。如果将字典打印出来或遍历其元素,将发现元素的排列顺序与添加顺序相同。

6.2.3 先创建一个空字典

在空字典中添加键值对有时候可提供便利,而有时候必须这样做。为此,可先使用一对空花括号定义一个字典,再分行添加各个键值对。

1
2
3
4
5
student_1 = {}
student_1['name'] = 'zhangsan'
student_1['age'] = 24
student_1['height'] = 175
print(student_1)

输出结果为:

1
{'name' : 'zhangsan', 'age' : 24, 'height' : 175}

使用字典来存储用户提供的数据或在编写能自动生成大量键值对的代码时,通常需要先定义一个空字典。

6.2.4 修改字典中的值

要修改字典中的值,可依次指定字典名、用方括号括起的键,以及与该键相关联的新值。

1
2
3
4
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
print(student_1)
student_1['age'] = 25
print(student_1)

输出结果为:

1
2
{'name' : 'zhangsan', 'age' : 24, 'height' : 175}
{'name' : 'zhangsan', 'age' : 25, 'height' : 175}

6.2.5删除键值对

对于字典中不再需要的信息,可使用del语句将相应的键值对彻底删除。使用del语句时,必须指定字典名和要删除的键。

1
2
3
4
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
print(student_1)
del student_1['height']
print(student_1)

输出结果为:

1
2
{'name' : 'zhangsan', 'age' : 24, 'height' : 175}
{'name' : 'zhangsan', 'age' : 24}

删除的键值对会永远消失。

6.2.6 由类似对象组成的字典

在前面的示例中,字典存储的是一个对象的多种信息,当也可以使用字典来存储众多对象的同一种信息。

1
favorite_languages = {'jen' : 'Pythone', 'sarah' : 'C', 'edward' : 'Ruby'}

6.2.7 使用get()来访问值

使用放在方括号内的键从字典中获取感兴趣的值时,可能会引发问题:如果指定的键不存在就会出错。

1
2
student_1 = {'name' : 'zhangsan', 'age' : 24}
print(student_1['height'])

输出结果为:

1
2
3
4
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
print(student_1['height'])
KeyError: 'height'

方法get()的第一个参数用于指定键,是必不可少的;第二个参数为指定的键不存在时要返回的值,是可选的:

1
2
3
student_1 = {'name' : 'zhangsan', 'age' : 24}
studen_height = studen_1.get('height', 'There is no key-value')
print(student_1['height'])

输出结果为:

1
There is no key-value

如果指定的键有可能不存在,应考虑使用方法get(),而不要使用方括号表示法。

调用get()时,如果没有指定第二个参数且指定的键不存在,Python将返回值None。这个特殊值表示没有相应的值。None并非错误,而是一个表示所需值不存在的特殊值。

6.3 遍历字典

字典可用于以各种方式存储信息,因此有多种遍历方式:可遍历字典的所有键值对,也可仅遍历键或值。

6.3.1 遍历所有键值对

1
2
3
4
5
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
for key, value in student_1.items():
print(f"key:{key}")
print(f"value:{value}\n")

输出结果为:

1
2
3
4
5
6
7
8
9
key:name
value:zhangsan

key:age
value:24

key:height
value:175

6.3.2 遍历字典中的所有键

在不需要使用字典中的值是,方法keys()很有用。

1
2
3
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
for key in student_1.keys():
print(key.title())

输出结果为:

1
2
3
Name
Age
Height

遍历字典时,会默认遍历所有的键。

1
2
3
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
for key in student_1:
print(key.title())

输出结果为:

1
2
3
Name
Age
Height #输出结果与使用方法keys()一致。

方法keys()并非只能用于遍历:实际上,它返回一个列表,其中包含字典中的所有键。

6.3.3 按特定顺序遍历字典中的所有键

要以特定顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此,可使用函数sorted()来获得按特定顺序排列的键列表的副本:

1
2
3
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
for key in sorted(student_1.keys()):
print(key.title())

输出结果为:

1
2
3
Age
Name
Height

6.3.4 遍历字典中的所有值

如果主要对字典包含的值感兴趣,可使用方法values()来返回一个值列表,不包含任何键。

1
2
3
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
for value in student_1.values():
print(value)

输出结果为:

1
2
3
zhang
24
175

这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题,但如果被调查者很多,最终的列表可能包含大量重复项。为剔除重复项,可使用集合(set)。集合中的每个元素都必须是独一无二的。

1
2
languages = {'Python', 'Java', 'C++', 'Python'}
print(languages)

输出结果为:

1
{'Python', 'Java', 'C++'}

6.4 嵌套

有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套

6.4.1 字典列表

1
2
3
4
5
6
student_1 = {'name' : 'zhangsan', 'age' : 24, 'height' : 175}
student_2 = {'name' : 'lisi', 'age' : 25, 'height' : 178}
student_3 = {'name' : 'wangwu', 'age' : 26, 'height' : 180}
students = [student_1, student_2, student_3]
for student in students:
print(student)

输出结果为:

1
2
3
{'name' : 'zhangsan', 'age' : 24, 'height' : 175}
{'name' : 'lisi', 'age' : 25, 'height' : 178}
{'name' : 'wangwu', 'age' : 26, 'height' : 180}

6.4.2 在字典中存储列表

1
2
3
4
5
6
7
8
9
10
favorite_languages = {
'zhangsan' : ['Python', 'Java'],
'lisi' : ['Java', 'C'],
'wangwu' : ['C++', 'Python']
}
for name, languages in favorite_languages.items():
print(f"{name.title()}`s favorite languages are:")
for language in languages:
print(f"\t{language}")

输出结果为:

1
2
3
4
5
6
7
8
9
Zhangsan`s favorite languages are:
Python
Java
Lisi`s favorite languages are:
Java
C
Wangwu`s favorite languages are:
C++
Python

6.4.3 在字典中存储字典

与在字典中存储列表类似,这里就不做演示。