字典Dictionary
字典结构
Python中字典是一种非常实用的结构,熟练使用Python中的字典能够有很大的帮助。
author = {'name':'Zhangsong','book_name':'asdfghjkl'}
print(author)
print(author['name'])
print(author['book_name'])
{'name': 'Zhangsong', 'book_name': 'asdfghjkl'}
Zhangsong
asdfghjkl
在Python中,字典使用花括号({})括起来的,且字典中都是以键值对的形式存在的内容;键值对是由冒号(:)分开的内容,冒号前面的被称为键,冒号后面的则被成为值;字典的定义形式:dictionary = {'key1':'value1','key2':'value2','key3':'value3'}
键值对是两个相关联的值,如上代码所示,我们访问某个键(key)时,会返回其对应的值,如字符串‘name’是一个键,与之关联的值则是‘Zhangsong’,当然在字典中可以由多个键值对,也可以只有一个键值对。
访问字典中的值
要获取与键相关联的值,可依次指定字典名和键;正如上面的程序所示,我们给出字典名author,并且给出键‘name’,这样组成author[‘name’],这样就可以访问到键所对应的值。
键值对的相关操作
字典是一种动态结构,可以随时向字典中添加键值对。添加键值对需要指定字典名、用方括号括起来的键和相关联的值。
dictionary['key4'] = 'value4'
print(dictionary['key4'])
value4
ch
修改字典中的值,修改字典中的值,可以依次指定字典名,用方括号括起来的键,以及该键所对应的新的值。
print(author['name'])
author['name'] = 'lisi'
print(author)
Zhangsong
{'name': 'lisi', 'book_name': 'asdfghjkl'}
可以看到,author字典的’name‘原本为’Zhangsong‘,现在已经修改为’lisi‘了
删除键值对,有时候我们可能不再需要字典中的某些信息,我们可以使用del语句将相对应的键值对彻底删除,使用del语句,必须指定字典名和要删除的键。
dictionary = {'key1':'value1','key2':'value2','key3':'value3'}
del(dictionary['key3'])
print(dictionary)
{'key1': 'value1', 'key2': 'value2'}
使用get()方法来访问值
我们可以通过使用字典名与方括号中加键的方法来获取值,但是,有时候如果我们记错了,字典中并没有我们想要的键,这时候,以上的获取值的方式就会报错。
del(dictionary['key3'])
print(dictionary)
print(dictionary['key3'])
Traceback (most recent call last):
File "E:\PycharmProjects\learn\Dictionary.py", line 21, in <module>
print(dictionary['key3'])
KeyError: 'key3'
{'key1': 'value1', 'key2': 'value2'}
字典的get()方法,有两个参数。第一个参数是不可为空的,用于指定要访问的键;第二个参数是可选的,当指定的键不存在时返回该信息,默认为None。
# get()方法
get1 = dictionary.get('key3')
get2 = dictionary.get('key4')
print(get1)
print(get2)
value3
None
可以看到,这里我都没有指定第二个可选参数,只写入了要访问的键。当要访问的key4不存在时,默认返回None。
get1 = dictionary.get('key3', 'No value assigned')
get2 = dictionary.get('key4', 'No value assigned')
print(get1)
print(get2)
value3
No value assigned
这一段代码中,我指定了可选的参数,当要访问的键不存在时,返回一个‘No value assigned’的提示。
遍历字典
一个Python字典可以包含成千上万个键值对,字典可以包含大量数据,Python也支持对字典进行遍历。由于Python字典存储信息的方式很多,所以我们可以既遍历键也遍历值,也可以只遍历键或只遍历值。
遍历所有键值对
如果想要访问字典中所有的键值对,应该怎么操作呢?还是用for循环来遍历这个字典。由于我们想要遍历字典中的所有键值对,也就是key:value,这样的形式,这里就有两个量需要取出,一个是key,一个是value。所以,在for循环中,我们也需要声明两个变量来进行取值,这样取值的时候,key给到第一个变量,value则给到第二个变量。
student1 = {
'stu_name':'Sun',
'grade':'1',
'data_structure': 90,
'operating_system': 85,
'C program': 85
}
for key,value in student1.items():
print(f"{key}:{value}")
stu_name:Sun
grade:1
data_structure:90
operating_system:85
C program:85
这里可以看到for循环声明的两个变量,一个为key,一个为value,in后面则是调用了字典的items()方法,返回可遍历的(键, 值) 元组列表。
这里小提一下items()方法,
print(student1.items())
dict_items([('stu_name', 'Sun'), ('grade', '1'), ('data_structure', 90), ('operating_system', 85), ('C program', 85)])
可以看到items()方法返回的是一个列表,列表中的每一个元素又是一个元组,元组中有两个原子元素,分别对应字典中的key和value。
遍历字典中的所有键
有时候,也许我们只需要遍历字典中的键,而不需要值,方法keys()非常合适。
# keys()方法
for key in student1.keys():
print(f"{key}")
stu_name
grade
data_structure
operating_system
C program
通过这个方法,是非常适合的。不过,即使不用keys()方法,也可以只访问键:
for key in student1:
print(f"{key}")
stu_name
grade
data_structure
operating_system
C program
遍历字典时,会默认遍历所有的键。但是,显式地使用方法keys()方法可以让代码更加容易理解。
Python 字典(Dictionary) keys() 函数以列表返回一个字典所有的键,其返回的是一个列表。
按特定顺序遍历字典中的所有键
从Python 3.7起,遍历字典时将按插入的顺序返回其中的元素。不过,有些时候我们希望按照某些特定的顺序来访问字典的键。前面,我们提到了,keys()方法返回的是一个列表,而在更之前的列表一章中,我们知道可以对列表进行使用sorted方法进行排序,所以,我们也可以按照排序的键来进行访问。
for key in sorted(student1.keys()):
print(f"{key}")
C program
data_structure
grade
operating_system
stu_name
注释:
list1 = student1.keys()
print(type(list1))
<class 'dict_keys'>
可以通过keys()方法得到的,具体来说,其类别并不是‘list’而是一个‘dict_keys’类别,所以它没有sort方法,因为sort方法是列表的特有方法。
遍历字典中的所有值
如果只想对字典中的值进行访问,可以使用values()方法来返回一个值列表,不包含任何键。
# values()方法
for value in student1.values():
print(f"{value}")
Sun
1
90
85
85
当然,准确地说,values()方法返回地类型并不是一个list列表类型,准确地说是一个
print(type(student1.values()))
<class 'dict_values'>
有时候,字典中的值可能会有大量的重复,例如,对于一个学生列表,里面其中记录学生名字和学院名。这其中就会有重复的学院名,有时候我们只希望知道都有那些学院而已,而不必重复,所以可以使用set()方法,set()会去除重复的内容。
info = {
'Sun': 'CS',
'Li': 'CS',
'Wang': 'CE',
'Wu': 'SS',
'Zhou': 'CE',
}
for academy in set(info.values()):
print(f"{academy}")
SS
CE
CS
注释:可以直接使用一对花括号直接创建集合,并在其中用逗号分隔元素。集合和字典很容易混淆,因为他们都是用一对花括号定义的,但是集合中并没有键值对。
academy = {'CS', 'CE', 'SS'}
print(type(academy))
print(academy)
<class 'set'>
{'SS', 'CE', 'CS'}
嵌套
Python的多个结构均可以进行嵌套,例如可以将字典存储在列表中,或将列表作为值存储在字典中,这成为嵌套。我们可以在字典中嵌套列表,可以在列表中嵌套字典,可以在字典中嵌套字典。
列表中嵌套字典
假设我们想在student1字典中存储更多人信息怎么办呢,毕竟现在这里只有一个人的信息。那我们可以建立多个字典,再将字典嵌套再列表中,实现一个字典列表。
student2 = {
'stu_name': 'Wu',
'grade': '1',
'data_structure': 85,
'operating_system': 85,
'C program': 87,
}
student3 = {
'stu_name': 'Li',
'grade': '2',
'data_structure': 83,
'operating_system': 86,
'C program': 80,
}
stu_list = [student1, student2, student3]
for student in stu_list:
print(student)
{'stu_name': 'Sun', 'grade': '1', 'data_structure': 90, 'operating_system': 85, 'C program': 85}
{'stu_name': 'Wu', 'grade': '1', 'data_structure': 85, 'operating_system': 85, 'C program': 87}
{'stu_name': 'Li', 'grade': '2', 'data_structure': 83, 'operating_system': 86, 'C program': 80}
我们又创建两个字典,其中每个字典都是一个学生的信息,然后将这些字典加入到列表stu_list中,最后遍历这个列表,并将每个学生信息打印出来。
字典中嵌套列表
有时候,我们需要在字典中存储列表,那要怎么做呢。
students = {
'name': ['Sun', 'Li', 'Wu'],
'grade': ['2', '1', '3'],
'data_structure': ['90', '85', '83'],
'operating_system': ['87', '85', '86'],
'C_program': ['85', '85', '86'],
}
print(students)
{'name': ['Sun', 'Li', 'Wu'], 'grade': ['2', '1', '3'], 'data_structure': ['90', '85', '83'], 'operating_system': ['87', '85', '86'], 'C_program': ['85', '85', '86']}
这样就可以定义一个嵌套着字典的列表。
students = {
'name': ['Sun', 'Li', 'Wu'],
'grade': ['2', '1', '3'],
'data_structure': ['90', '85', '83'],
'operating_system': ['87', '85', '86'],
'C_program': ['85', '85', '86'],
}
for key in students.keys():
str_key = key.__str__()
for values in students[str_key]:
print(f"{key, values}")
('name', 'Sun')
('name', 'Li')
('name', 'Wu')
('grade', '2')
('grade', '1')
('grade', '3')
('data_structure', '90')
('data_structure', '85')
('data_structure', '83')
('operating_system', '87')
('operating_system', '85')
('operating_system', '86')
('C_program', '85')
('C_program', '85')
('C_program', '86')
有时候,我们希望像表格一样,来看待一些数据,我们希望了解都有那些学生,希望了解这些学生的某些成绩。我们可以利用for循环来获取这些数据,实际上,我们用一个for循环来得到所有的键(key)信息,因为我们知道所有的键对应的实际上是一个列表,所以我们通过这些键来获取对应的列表,最后通过for循环来访问这个列表。所以,整个流程实际上是比较简单的。所有的程序都可以被拆解,我们需要想的问题是我们
当然,以上的格式总让人觉得不够美观,我们可以有更美观的输出方式。
for key in students.keys():
str_key = key.__str__()
print(str_key, ":", end=' ')
for values in students[str_key]:
print(f"{values}", end='\t')
if values == students[str_key][-1]:
print()
name : Sun Li Wu
grade : 2 1 3
data_structure : 90 85 83
operating_system : 87 85 86
C_program : 85 85 86
字典中嵌套字典
我们可以在字典中嵌套字典,现实中也有一些地方可能会用到字典嵌套字典的地方。
如《Python编程从入门到实践 第2版》中的例子所示,“如果有多个网站用户, 每个都有独特的用户名, 可在字典中将用户名作为键, 然后将每位用户的信息存储在一个字典中, 并将该字典作为与用户名相关联的值。”
users = {
'einstein': {
'first': 'albert',
'last': 'einstein',
'location': 'princeton'
},
'curie': {
'first': 'marie',
'last': 'curie',
'location': 'pairs',
},
}
for username, user_info in users.items():
print(f"\nUsername: {username}")
full_name= f"{user_info['first']}{user_info['last']}"
location = user_info['location']
print(f"\tFull_name:{full_name.title()}")
print(f"\tLocation:{location.title()}")
Username: einstein
Full_name:Alberteinstein
Location:Princeton
Username: curie
Full_name:Mariecurie
Location:Pairs