举个栗子
我们用字典来存储类似学生信息,既能有较好的结构,也能使代码更加简洁明了,如下:
student={
'id':'100001',
'name':'Jack',
'gender':'male',
'age':19
}
print(type(student))
print(student)
像这样,用大括号({})包裹的,内部由键值对构成的存储结构,我们就称之为“字典(dictionary)”。具体到细节部分,键值对格式如下:键:值,,键和值之间用冒号(:)分隔,键值对之间用逗号(,)进行区分。我们看看程序输出结果:
{'id': '100001', 'name': 'Jack', 'gender': 'male', 'age': 19}
[Finished in 0.2s]
我们首先用type()函数输出student变量的类型,可以看出这的确是一个字典(dict);再看student的输出,也和我们的输入是一致的(当然,前提是你得忍受它难看的结构)。
简单操作字典
通过上面的程序,我们简单了解了字典的结构,下面我们来学习它的具体用法。
访问字典
用print()语句可以直接打印输出字典的全部内容,但是我们只想要取具体某值时该如何操作呢,继续看下面的例子:
student={
'id':'100001',
'name':'Jack',
'gender':'male',
'age':19
}
print('My name is',student['name'])
print('My id is',student['id'],',and I am',student['age'],'years old.')
通过student变量的键(索引),我们就可以取出其对应值,输出结果如下:
My name is Jack
My id is 100001 ,and I am 19 years old.
[Finished in 0.1s]
可以看到,取出值的方式类似于(好吧,其实是一样)列表,请同学们留心。
添加数据
向字典中添加新的数据,或者更新数据也是通过类似列表的操作,如下:
student={
'id':'100001',
'name':'Jack',
'gender':'male',
'age':19
}
student['class']='1'
student['name']='Lucy'
print(student)
向字典里添加一个字段(信息),class班级。不同于取出值,这是一个全新的(......总会想到渣渣辉)“键”,Python程序会自动把键和对应值添加到字典当中,而且,因为是一一对应的关系,字典内部并不存在前后顺序这样的说法。而当键是原本已存在的键时,在我们对其赋值后,新值就会把原来的值覆盖。程序运行结果如下:
{'id': '100001', 'name': 'Lucy', 'gender': 'male', 'age': 19, 'class': '1'}
[Finished in 0.1s]
看到输出的内容,‘name’字段已经更新为‘Lucy’(可以是个男的),并且字典当中新增了‘class’字段。
既然有了上述新增数据的方法,我们也可以用如下方式创建字典:
student={}
student['id']='10001'
student['name']='Jack'
student['gender']='male'
student['age']=19
print(student)
只需要创建一个空的字典,然后再往其中添加字段,就能灵活的创建字典。输出结果相同,由于篇幅有限,不另作展示。
删除数据
使用del语句可以删除字典中的字段,如下:
student={}
student['id']='10001'
student['name']='Jack'
student['gender']='male'
student['age']=19
print(student)
del student['age']
print(student)
直接用del后接选中字典键,的方式,就可以删除字段,来看输出结果:
{'id': '10001', 'name': 'Jack', 'gender': 'male', 'age': 19}
{'id': '10001', 'name': 'Jack', 'gender': 'male'}
[Finished in 0.1s]
对比很明显。
遍历字典
前面用大量篇幅介绍过了列表的遍历,即通过for语句和if语句循环输出列表元素。字典的遍历与列表的遍历有相似之处,请看下面:
student={
'id':'10001',
'name':'Jack',
'gender':'male',
'class':'1',
'age':19
}
for key,value in student.items():
print(key+":"+str(value))
可以看到有两处明显的不同,参数不同和student后面多了一个小尾巴。
在Python,for语句里的参数可以有两个,无需多言;而字典名后面的items()函数的作用则类似于将字典变成可遍历信息或者取出值。参数key和参数value分别代表了字典的键和值。值得一提的是,因为age字段的值是int类型,在输出的时候需要进行类型转转换。
遍历键
for循环除了可以遍历字典的键值对以外,还可以对字典的键进行单独遍历,通过keys()方法实现:
student={
'id':'10001',
'name':'Jack',
'gender':'male',
'class':'1',
'age':19
}
for key in student.keys():
print('Key:'+key)
看到,字典名后面的items()方法变为了keys()方法,参数部分只有代指键的参数key,它的输出方式相当于是在完整输出键值对的基础上简化,程序运行结果如下:
Key:id
Key:name
Key:gender
Key:class
Key:age
[Finished in 0.1s]
只是输出键。当然像下面这样的写法也是允许的:
student={
'id':'10001',
'name':'Jack',
'gender':'male',
'class':'1',
'age':19
}
for key in student:
print('Key:'+key)
和列表的遍历是一样的,我们所用的keys()方法其实是Python在遍历字典中的默认方法,但是仍然强烈建议加上keys()方法,这样程序有更好的可读性。
keys()
继续来了解一下keys()的具体含义,我们可以直接打印出keys()方法,如下:
print(student.keys())
看看结果:
dict_keys(['id', 'name', 'gender', 'class', 'age'])
[Finished in 0.1s]
很明显,可以看出这是一个由字典的键所组成的列表,每一次的for循环就是在这里面进行取值。
items()
同样的,我们也可以对前面所讲的items()方法进行打印输出:
print(student.items())
程序运行结果如下:
dict_items([('id', '10001'), ('name', 'Jack'), ('gender', 'male'), ('class', '1'), ('age', 19)])
[Finished in 0.1s]
比上面的稍微复杂,列表里面包含了键值对构成的元组。在用for循环遍历时,就是在这里面取出一个个键值对,两个参数分别对应键和值。
遍历值
和keys()方法一样,对应取值的方法有values()方法,如下:
print(student.values())
只需要在字典名后面加上values()方法,看看输出结果:
dict_values(['10001', 'Jack', 'male', '1', 19])
[Finished in 0.1s]
只取到值的部分。
有同学就会问了,如果字典中的值出现重复(键当然不会)怎么办呢,请看下例:
student={
'id':'10001',
'name':'male',
'gender':'male',
'class':'1',
'age':19
}
print(student.values())
将名字修改为“male”,和性别一样(别问我为什么有这样的名字),然后再来看看输出结果是怎样的:
dict_values(['10001', 'male', 'male', '1', 19])
[Finished in 0.2s]
列表中出现了重复值,显然不符合我们的要求。
通过set()方法就可以去除重复值,set就是集合,它不允许重复值,修改后的代码如下:
student={
'id':'10001',
'name':'male',
'gender':'male',
'class':'1',
'age':19
}
print(set(student.values()))
print(type(set(student.values())))
看到这么多括号先不用害怕,一层一层剥开它的芯,你会发现,你会讶异,你会鼻酸,你会流泪(谁在边上切洋葱啊喂),我们只是在原有基础上增加set()函数,它会把values()方法得到的列表变为set集合,达到去除重复值的目的,看看输出结果:
{'10001', 'male', 19, '1'}
[Finished in 0.1s]
先看下面那行,说明它已经被转换成了set集合,它的格式在上面,也是用大括号包裹,里面的“male”重复值已经被去除了。
字典的嵌套
程序中会遇到的不只有单纯的某一结构,更多时候是以复杂的嵌套方式出现。
字典列表
字典列表就是由字典充当列表元素组成的列表,比如某个班级的学生信息:
student1={
'id':'10001',
'name':'Jack',
'gender':'male',
'class':'1',
'age':19
}
student2={
'id':'10002',
'name':'Lucy',
'gender':'female',
'class':'1',
'age':20
}
student3={
'id':'10003',
'name':'Tom',
'gender':'male',
'class':'1',
'age':20
}
students=[student1,student2,student3]
print(students)
将三个学生的信息放入students列表里,就构成了字典列表,输出结果如下:
[{'id': '10001', 'name': 'Jack', 'gender': 'male', 'class': '1', 'age': 19}, {'id': '10002', 'name': 'Lucy', 'gender': 'female', 'class': '1', 'age': 20}, {'id': '10003', 'name': 'Tom', 'gender': 'male', 'class': '1', 'age': 20}]
[Finished in 0.1s]
这样看起来不太方便,我们可以对列表再进行遍历:
for student in students:
print(student)
像这样输出看起来会美观许多:
{'id': '10001', 'name': 'Jack', 'gender': 'male', 'class': '1', 'age': 19}
{'id': '10002', 'name': 'Lucy', 'gender': 'female', 'class': '1', 'age': 20}
{'id': '10003', 'name': 'Tom', 'gender': 'male', 'class': '1', 'age': 20}
[Finished in 0.1s]
列表元素是字典。
在字典中嵌套列表
这是一种更为复杂的情况,比如我们想在学生信息中新增一条info字段用来存储该学生的身高体重,代码如下:
student1={
'id':'10001',
'name':'Jack',
'gender':'male',
'class':'1',
'age':19,
'info':['1.73m','60kg']
}
student2={
'id':'10002',
'name':'Lucy',
'gender':'female',
'class':'1',
'age':20,
'info':['1.65m','52kg']
}
student3={
'id':'10003',
'name':'Tom',
'gender':'male',
'class':'1',
'age':20,
'info':['1.90m','70kg']
}
students=[student1,student2,student3]
for student in students:
print(student)
print('Height: '+student['info'][0])
print('Weight: '+student['info'][1])
print('---------------------------')
除了新增“info”以外,在for循环中,我们增加了对“info”里的元素的单独输出,程序运行结果如下:
{'id': '10001', 'name': 'Jack', 'gender': 'male', 'class': '1', 'age': 19, 'info': ['1.73m', '60kg']}
Height: 1.73m
Weight: 60kg
---------------------------
{'id': '10002', 'name': 'Lucy', 'gender': 'female', 'class': '1', 'age': 20, 'info': ['1.65m', '52kg']}
Height: 1.65m
Weight: 52kg
---------------------------
{'id': '10003', 'name': 'Tom', 'gender': 'male', 'class': '1', 'age': 20, 'info': ['1.90m', '70kg']}
Height: 1.90m
Weight: 70kg
---------------------------
[Finished in 0.1s]
重点在于单独取出“info”的部分,for循环先取出一条student信息,然后选中键值“info”,再通过[0]定位到嵌套列表的第一个元素“height”,通过[1]定位到嵌套列表的第二个元素“weight”,这样就可以单独输出info了。
在字典中嵌套字典
字典中既然可以嵌套列表,当然也能够嵌套字典了。但这样做想想就很复杂,一般较少使用,比如下例:
phones={
'iPhone X':{
'capacity':'64G',
'price':'RMB 8316'
},
'iPhone 8':{
'capacity':'64G',
'price':'RMB 5837'
}
}
for name,info in phones.items():
print(name)
print(info)
print('-------------------------')
以苹果手机为例,字典包含名字和基本信息,输出结果如下:
iPhone X
{'capacity': '64G', 'price': 'RMB 8316'}
-------------------------
iPhone 8
{'capacity': '64G', 'price': 'RMB 5837'}
-------------------------
[Finished in 0.1s]
因为这种类型的嵌套比较少接触到,了解即可。
小结
呐呐,还记得上一节末我们的总结小诗吗,那可是花重金请来的御用湿人,今天再一次请到了这位湿人为我们赋诗一首:
这是诗
by Tao_皮鼓
玫瑰是红的,
我的心是蓝的。
字典是成对的键值,
上一次我已经讲过。
除了增删改查,
还可以,
和列表进行嵌套。
除了用print,
还可以,遍历,
用for和if语句灵性输出。
待到一撃男更新时,
就是我们见面日。
okok,今天的内容就讲完了,下一章,我们会学习while语句,并且通过用户输入实现和程序的交互。
你可以扫描下方二维码找到我哦: