Python的字典

字典

1. 字典的定义

  在Python中,字典是一种key-value的数据类型,也是唯一的映射类型;字典还是另一种可变容器类型,且可存储任意类型对象,其中也可包括其他容器类型。字典的每个键值(key-value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,语法格式如下:

  dictionary = {

key1 : value1,

key2 : value2,

......

keyN:valueN,

}

  映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。

  

2.  字典的特性

  字典的特性有:

  (1)字典是无序的。

  (2)字典的键key必须是唯一的,所以字典中不存在重复数据。

  (3)键key与值value用冒号“:”分开。

  (4)项与项用逗号“,”分开。

3.  字典的操作

  在Python中,由于字典的动态性,我经常需要对其进行键-值对的增、删、改、查,查即访问。

3.1 字典的创建

3.1.1 创建一个空字典

  在Python中,我们有时需要先创建一个空字典,然后用于存储一些键-值对。创建一个空字典的方式很简单,即让字典等于一个大括号即可。具体语法格式如下所示:

  dictionary = {}

3.1.2 创建一个有键-值对的字典

  根据字典的定义中的语法,创建一个以学生学号为key,姓名为value,创建一个字典。

  例如,以五个学生为例,将每个学生的基本学号和姓名存到字典中,并打印出来。

  代码:

 1 students ={
2 'S100001':"Yun Qtian",
3 'S100002':"Feng Kuang",
4 'S100003':"Yu Bao",
5 'S100004':"Dian Lei",
6 'S100005':"Yu Xiao",
7 }
8 print(students)

  运行结果:

1 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}

3.2  字典中值的访问

  在Python中,由于字典是一系列键-值对。每个键都与一个值关联,我们可以使用键来访问其相关联的值,这些值可以是数字、字符串、列表乃至字典等,即可将Python中的任何对象作为字典中的值。

  因此,在Python中,我们通过以下方式访问字典中的值:

  字典名[键]

  例如,我们将学生的学号和姓名存到字典中,然后取出学为S100003的学生的姓名。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print(students['S100003'])

  说明:

  第8行,由于我们将学号作为学生字典的key,故通过学号即可访问字典中对应的值。此处我们使用学号‘S100003’取出相应的值,并将其打印出来。

  运行结果:

 Yu Bao

  

  以*问通过key访问字典的值的方式,前提是我们已经知道该key存在字典中。但是,如果我们查找的key不存在该字典中时,该访问方式就会报错,那么Python为我们提供了另一种通过key查找其在字典中的对应的value。  

  例如,我们将学生的学号和姓名存到字典中,然后查找学为S100009的学生是否存在字典中,并打印相关值。

  代码1:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print(students)
print(students['S100009'])

  运行结果1:

 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
Traceback (most recent call last):
File "F:/PyProject/s14/day2/test_dictionary.py", line 9, in <module>
print(students['S100009'])
KeyError: 'S100009'

  从以上结果可知,第9行的Key错误,因为字典students中没有这个key。所以Python中,通过key查找其对应的value时,为了避免不必要的错误,可使用get()方法来查找key对应的value。

 

  代码2:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print(students)
print(students['S100003'])
print(students.get('S100003'))
print(students.get('S100009'))

  说明:

  第9、10行,都是通过key (S100003),分别查找其对应的value的值方式,只是第10行使用了get()方法。

  第11行,使用get()方法查找key(S100009)的值。

  运行结果2:

 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
Yu Bao
Yu Bao
None

  从以上运行结果可知,当我们确定提供的key已经存在字典中,那么使用哪种访问方式都无所谓,其结果都一样,但是,如果我们不知道key是否存在字典中,那么就用get()方法的方式查找,这样避免出错,没有找到时,Python解释器会返回一个None。

3.3 字典的键-值对增加

  在Python中,字典是一种动态结构,可随时在其中增加我们需要的键-值对。当我们要往字典中增加键-值对时,可依次指定字典名、用方括号括起来的键和其关联的值。其格式如下:

  dictionary [kek]  = value

例如,我们创建一个空的字典,然后将学生的学号作为键,姓名作为其对应的值,并将其增加到该空字典中。

  代码:

 students = {}
students['S100001'] = "Yun Qtian"
students['S100002'] = "Feng Kuang"
students['S100003'] = "Yu Bao"
students['S100004'] = "Dian Lei"
students['S100005'] = "Yu Xiao"
print(students)

  说明:

  第1行,定义一个空字典students。

  第2~6行分别将学号即其对应的学生的姓名增加到空列表students中。

  第7行,打印增加键-值对后的字典。

  运行结果:

 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}

3.4 字典键-值对的删除

  在Python中,对于字典中不再需要的信息,可使用del语句将其从字典中删除。使用del语句时,必须指定字典名和删除的键。del 语句删除字典中的键-值对的信息的语法格式为:

  del dictionary [key]

  例如,由于学生S100005转学了,我们需要将期从字典students中删。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print("删除前的字典:",students)
del students['S100005']
print("删除后的字典:",students)

  说明:

  第9行,使用del语句删除字段students中的学号为S100005的信息。

  运行结果:

 删除前的字典: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
删除后的字典: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei'}

  从以上的运行结果中,可知,我们删除的键-值对,永久从字典中删除,但不会影响到其他的键-值对。

  字典的键-值对的删除除以上的del语句外,还有一种pop()方法,其语法格式如下:

  dictionary.pop(key)

  例如,用pop实现键-值对的删除。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print("删除前的字典",students)
print("删除的值:",students.pop('S100002'))
print("删除后的字典",students)

  说明:

  第9行,使用pop()方法删除学号为S100002的学生信息。

  运行结果:

 删除前的字典 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
删除的值: Feng Kuang
删除后的字典 {'S100001': 'Yun Qtian', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}

3.5 字典键-值对的修改

  在Python中,要修改字典中的值,可依次指定字典名、用方括号括起来的键,以及该键对应的新值。其语法格式为:

  dictionary [key] =  value

  例如,我们将已有字典中学号为S100005的姓名改为“Yu Da”。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print("修改前的字典:",students)
students['S100005'] = "Yu Da"
print("修改后的字典:",students)

  说明:

  第9行,将字典students中学号为S100005的姓名改为“Yu Da”。

  运行结果:

 修改前的字典: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
修改后的字典: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Da'}

  

3.6 字典的合并

  在Python中,有时为了使用方便,我们可能需要将一个字典合并到另一个字典中。字典的合并可以使用update()方法,该方法的具体功能是,如果合并的字典的key在原来的字典中存在,那么根据key值更新相应的值,否则在原有的字典中新增新的键-值对。

  例如,我们创建两个字典,一个字典为students_a,另一个字典为students_b,然后将字典students_2合并到students_1中。

  代码:

 students_a ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
} students_b ={
'S100005':"Yun Wu",
'S100006':"Hong Cai",
}
print("合并前的字典students_a:",students_a)
print("合并前的字典students_b:",students_b)
students_a.update(students_b)
print("合并后的字典students_a:",students_a)
print("合并后的字典students_b:",students_b)

  说明:

  第1~7行,创建了一个字典students_a,该字典中有五个键-值对。

  第9~12,创建了一个字典students_b,该字典中有两个键-值对。

  第15行,使用函数update(),将字典students_b合并到字典students_a中。

  运行结果:

 合并前的字典students_a: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
合并前的字典students_b: {'S100005': 'Yun Wu', 'S100006': 'Hong Cai'}
合并后的字典students_a: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yun Wu', 'S100006': 'Hong Cai'}
合并后的字典students_b: {'S100005': 'Yun Wu', 'S100006': 'Hong Cai'}

  从以上的运行结果中可知,由于字典students_b中的key为S100005已经存在字典students_a中,则合并后,会将字典students_a中的值更新为合并过来的新值;key为S100006的在字典students_a中没有,故将字典students_b中的S100006及其对应的值增加到字典student_a中。

  注意,虽然将字典students_b合并到了字典students_a中,但字典students_b仍然存在,还可继续使用。

3.7 字典转换列表

  在Python中,有时我们需要将一个字典转换为列表,那么可以使用函数items()。

  例如,将一个已有的学生字典转换为列表。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print("转换前的字典students:",students)
students_list = students.items()
print("转换后的字典students:",students)
print("转换后的列表:",students_list)
print("----字典转换为列表后,列表的元素如下:----")
for student in students_list:
print(student)

  说明:

  第9行,使用函数items()将字典students转换为一个列表,并赋值给变量students_list。

  第13~14行,循环打印转换后的列表元素。

  运行结果:

 转换前的字典students: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
转换后的字典students: {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
转换后的列表: dict_items([('S100001', 'Yun Qtian'), ('S100002', 'Feng Kuang'), ('S100003', 'Yu Bao'), ('S100004', 'Dian Lei'), ('S100005', 'Yu Xiao')])
----字典转换为列表后,列表的元素如下:----
('S100001', 'Yun Qtian')
('S100002', 'Feng Kuang')
('S100003', 'Yu Bao')
('S100004', 'Dian Lei')
('S100005', 'Yu Xiao')

  从以上的运行结果可知,字典转为为列表后,字典仍然可以继续使用,只是将其键-值对转换为一个列表的元素而已。

3.8 初始化一个字典

  在Python中,我们有时需要初始化一个字典,那么可使用fromkeys()方法。

  例如,初始化一个员工字典。

  代码:

 emp_dicf = dict.fromkeys(['G100001','G100002','G100003'],{"emp_name","emp_job"})
print(emp_dicf)

  说明:

  第1行,使用fromkeys()方法初始化一个字典emp_dicf 。

  运行结果:

 {'G100001': {'emp_name', 'emp_job'}, 'G100002': {'emp_name', 'emp_job'}, 'G100003': {'emp_name', 'emp_job'}}

  赋值代码:

 emp_dict = dict.fromkeys(['G100001','G100002','G100003'],["Yun Qtian",{"emp_name":"Dian  Lei"},"Feng Kuang"])
print(emp_dict)
emp_dict['G100002'][1]['emp_name'] = "Yu Xiao"
print(emp_dict)

  赋值运行结果:

 {'G100001': ['Yun Qtian', {'emp_name': 'Dian  Lei'}, 'Feng Kuang'], 'G100002': ['Yun Qtian', {'emp_name': 'Dian  Lei'}, 'Feng Kuang'], 'G100003': ['Yun Qtian', {'emp_name': 'Dian  Lei'}, 'Feng Kuang']}
{'G100001': ['Yun Qtian', {'emp_name': 'Yu Xiao'}, 'Feng Kuang'], 'G100002': ['Yun Qtian', {'emp_name': 'Yu Xiao'}, 'Feng Kuang'], 'G100003': ['Yun Qtian', {'emp_name': 'Yu Xiao'}, 'Feng Kuang']}

  从以上的运行结果可知,所有的key为emp_name的值都被改为了Yu Xiao,这并不是我们想要的结果,我们只是想修改key为G100002的员工对应的姓名,其他的键-值对不变。

  因此,fromkeys()方法只适合用于初始化字典,并不能用于给具体的键-值对赋值。

4.  字典的遍历

  在Python中,一个字典可能包含几个键-值对,也可能包含数百万个键-值对。鉴于字典可能包含大量数据,Python支持对字典进行遍历。由于字典可以用于存储个汇总给形式的信息,因此,对字典的遍历方式也有多种:可遍历字典的所有键-值对、键或值等。

4.1 遍历字典中的所有键-值对

  在Python中,我们可以使用for循环遍历字典中的所有键-值对。

  例如,我们遍历字典students重点额所有学生的学号和姓名。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print(students)
print('----第一种遍历方式----')
for student in students:
print(student,students[student])
print('----第二种遍历方式----')
for key,value in students.items():
print(key,value)

  说明

  第10行,用for循环对字典students进行遍历,每次遍历的键-值对存到变量student中。

  第11行,打印每次循环的键-值对。

  第13行,用for循环对字典students进行遍历,每次遍历的键和值分别存到变量key和value中。

  第14行,打印每次循环的键和值。

  运行结果:

 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
----第一种遍历方式----
S100001 Yun Qtian
S100002 Feng Kuang
S100003 Yu Bao
S100004 Dian Lei
S100005 Yu Xiao
----第二种遍历方式----
S100001 Yun Qtian
S100002 Feng Kuang
S100003 Yu Bao
S100004 Dian Lei
S100005 Yu Xiao

  注意:从以上的运行结果可知,两种方式都能遍历字典,但是第一种方式的遍历效率比第二种方式高效,因为第二种方式有一个将字典转换为列表的过程。

4.2 遍历字典中的所有的键

  在Python中,当我们需要使用字典中的键时,方法keys()很有用,它可以从字典中提取出所有的键。

  例如,打印字典中所有学生的学号。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print(students)
print("学生的学号如下:")
print("----第一种方式-----")
for student_no in students.keys():
print(student_no)
print("----第二种方式-----")
for _student_no in students:
print(_student_no)

  说明:

  第11行,在for循环中,使用方法keys()读取字典students中的中所有key,并存于变量student_no中。

  第14行,在for循环中,将每次循环的值存到变量_student_no中。

  运行结果:

 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
学生的学号如下:
----第一种方式-----
S100001
S100002
S100003
S100004
S100005
----第二种方式-----
S100001
S100002
S100003
S100004
S100005

  从以上的运行结果,我们可知,在Python中,当我遍历字典时,Python解释器会默认遍历所有的键,因此,两种循环遍历的输出结果都是一致的。只是使用keys()方法可以让代码更容易理解。

4.3 遍历字典中的所有的值

  在Python中,有时我们只需要输出字典的值,不关注键,此时,我们可以使用方法values(),该方法即可放回一个值列表,而不包含任何键。

  例如,我们打印字典中的学生的姓名。

  代码:

 students ={
'S100001':"Yun Qtian",
'S100002':"Feng Kuang",
'S100003':"Yu Bao",
'S100004':"Dian Lei",
'S100005':"Yu Xiao",
}
print(students)
print("学生的姓名如下:")
print("----第一种方式-----")
for student_name in students.values():
print(student_name)
print("----第二种方式-----")
for kek in students.keys():
print(students[kek])

  说明:

  第11行,在for循环中,调用方法values()从字典中读取字典的值,并存于变量student_name中。

  第14行,在for循环中,调用方法keys()从字典中读取字典的键,并存于变量key中。

  第15行,通过每次取到的key访问字典的值。

  运行结果:

 {'S100001': 'Yun Qtian', 'S100002': 'Feng Kuang', 'S100003': 'Yu Bao', 'S100004': 'Dian Lei', 'S100005': 'Yu Xiao'}
学生的姓名如下:
----第一种方式-----
Yun Qtian
Feng Kuang
Yu Bao
Dian Lei
Yu Xiao
----第二种方式-----
Yun Qtian
Feng Kuang
Yu Bao
Dian Lei
Yu Xiao

  

5.  嵌套

  在Python中,有时我们需要将一系列字典存储在列表中,或将列表作为值存储到字典中,这就是所谓的嵌套。嵌套是一项强大的功能,我们可以在列表中嵌套字典、在字典中嵌套列表,也可以在字典中嵌套字典等。

5.1 字典列表

  字典列表,即由字典组成的列表,或者说在空列表中嵌套字典。

  例如,我们先创建一个空列表,再分别三个字典,然后将该三个字典嵌套到列表中。

  代码:

 students_list = []
students_1 = {
'student_no':"S100001",
'sex':"M",
'age':""
}
students_2 = {
'student_no':"S100002",
'sex':"M",
'age':""
}
students_3 = {
'student_no':"S100003",
'sex':"F",
'age':""
}
students_list.append(students_1)
students_list.append(students_2)
students_list.append(students_3)
print(students_list)
for student in students_list:
print(student)

  说明:

  第1行,创建一个空列表students_list 。

  第2~6行,创建第一个字典student_1。

  第7~11行,创建第二个字典student_2。

  第12~16行,创建第三个字典student_3。

  第17~19行,分别将创建的三个字典增加到创建的空列表中。

  第21~22行,循环打印该列表的元素。

  运行结果:

 [{'student_no': 'S100001', 'sex': 'M', 'age': ''}, {'student_no': 'S100002', 'sex': 'M', 'age': ''}, {'student_no': 'S100003', 'sex': 'F', 'age': ''}]
{'student_no': 'S100001', 'sex': 'M', 'age': ''}
{'student_no': 'S100002', 'sex': 'M', 'age': ''}
{'student_no': 'S100003', 'sex': 'F', 'age': ''}

5.2 在字典中存储列表

  在Python中,有时我们需要将列表存于字典,而不是将字典存于列表。

  例如,我们创建一个空字典,然后分别创建三个列表,并将其存于字典中。

  代码:

 students = {}
student_list1 =["S100001","M",""]
student_list2 =["S100002","M",""]
student_list3 =["S100003","F",""]
students[student_list1[0]] = student_list1
students[student_list2[0]] = student_list2
students[student_list3[0]] = student_list3
print(students)
for value in students.values():
print(value)
for _students in value:
print(_students)

  说明:

  第1行,创建一个空字典students。

  第2~4行,分别创建一个不同的列表。

  第5~7行,以每个学生的学号为key,列表的值为value分别向空字典中增加键-值对。

  第8行,打印嵌套后的字典。

  第9~10行,循环打印字典的值。

  第11~12行,循环打印被嵌套的列表的每个元素。

  运行结果:

 {'S100001': ['S100001', 'M', ''], 'S100002': ['S100002', 'M', ''], 'S100003': ['S100003', 'F', '']}
['S100001', 'M', '']
S100001
M
20
['S100002', 'M', '']
S100002
M
21
['S100003', 'F', '']
S100003
F
18

  在Python中,列表和字典的嵌套层级不应太多。如果嵌套层级非常多,很可能有更简单的解决方案。

5.3  在字典中存储字典

  在Python中,我们虽然可以在字典中嵌套字典,但这样也许会让代码很快就复杂起来。

  例如,我们将每个学生的基本信息作为一个字典,然后再存到一个总的字典中。

  代码:

 students ={
"S100001":{
"sex":"M",
"age":"",
},
"S100002": {
"sex": "M",
"age": "",
},
"S100003": {
"sex": "F",
"age": "",
},
}
print(students)
for key,value in students.items():
print(key,value["sex"],value["age"])

  说明:

  第1~14行,创建一个字典students,其中第2~5行为字典students的一个键-值对,而第3~4行又是键-值对字典的一个键-值对,字典students的其余两个键-值对也类似。

  第15行,打印字典的键-值对。

  第16~17行,循环打印字典中的每个键-值对的具体值。

  运行结果:

 {'S100001': {'sex': 'M', 'age': ''}, 'S100002': {'sex': 'M', 'age': ''}, 'S100003': {'sex': 'F', 'age': ''}}
S100001 M 20
S100002 M 21
S100003 F 18

  到此为止,Python的字典学习就完成了。

  

上一篇:linux大文件分割 split命令


下一篇:SpringMVC拦截器(包括自定以拦截器--实现HandlerInterceptorAdapter)(资源和权限管理)