在python中,字典是一种key-value类型数据,在字典中,key是一个元素惟一的标识,什么是字典类型,下面举一个简单的例子。
student = {'20141346001':'dinghaisheng', '20141346002':'wangzichun', '20141346003':'wangruiju'} print(student)
注意key和value之间是用分号,每一个元素之间是用逗号,这是一个python中一个名为student的数据,里面有三个元素,前一个表示学号,后一个是名字,我们都知道在学校中可能有重名的情况,但是学号是唯一的,这点在python字典数据类型中也一样。
然后来说一下对字典的操作,常规操作为增、删、改、查。
1. 如果我想增加一个学号为20141346005的学生名叫jiangwei
student['20141346005'] = 'jiangwei'
2.如果我想删除学号为20141346003的学生,可以 del 字典名[想删除的学号]
del student['20141346003']
如果直接del student,则表示直接删除了student这个字典(即删除该字典中所有元素),这里再介绍一种删除字典元素的方法
student.pop('20141346003')
3. 如果我想修改学号20141346001的学生名字为haisheng
student['20141346001'] = 'haisheng'
4. 如果我想查找学号为20141346001的学生名字是否在这个student字典中,可以
print('20141346001' in student )
返回的值为True,若字典中没有这个key会返回False
如果我想查找学号为20141346001的学生的姓名,这里介绍两种写法
print(student['20141346001']) print(student.get('20141346001'))
以上两种写法当学号为20141346001的学生存在时都能查到,且查找结果相同,那么这两种写法区别是什么???
假如我查找一个不存在的学号如20141346009
print(student['20141346009'])
用这种方式系统会直接报错
print(student.get('20141346009'))
这种方式系统会显示None,所以还是推荐第二种写法。
以上基本操作的完整代码如下:
student = {'20141346001':'dinghaisheng', '20141346002':'wangzichun', '20141346003':'wangruiju',} student['20141346003'] = 'weipengxiang' #del student['20141346003'] #student.pop('20141346003') student['20141346001'] = 'haisheng' print('20141346001' in student ) #print(student['20141346009']) print(student.get('20141346009')) print(student)
以上操作的完整输出结果如下:
True
None
{'20141346001': 'haisheng', '20141346002': 'wangzichun', '20141346003': 'weipengxiang'}
---------------------------------------我是美丽惹人爱的分割线--------------------------------------------------------------
然后讲一些比较复杂的操作,毕竟在实际项目中,我们遇见的不可能是上面如此简单的字典数据,往往数据中还有嵌套,比如说下面一个很简单的嵌套
school = {'北京':{'重点学校':{'重点学校中的重点之一':'清华', '重点学校中的重点之二':'北大'}, '211学校':'北京邮电大学', '非211学校':'某些野鸡大学'}, '上海':{'最为人知的大学':'上海交大', '不太出名但是也很厉害':'同济大学', '非211大学':'某些野鸡大学'}, '浙江':{'我最想考的大学':'浙江大学', '计算机很厉害的一个学校':'杭州电子科技大学', '非211学校':'某些野鸡大学'} }
假如我想把‘’北大‘’这个数据取出来,我们怎么办?
print(school['北京']['重点学校']['重点学校中的重点之二'])
如果我想把‘北大 ’改为‘北京大学’怎么办?
school['北京']['重点学校']['重点学校中的重点之二'] = '北京大学'
其实跟我们之前讲的没有嵌套的操作方法是相差不多的,所以读者可以自己类比前面的增、删、改、查方法对多级嵌套进行操作
最后讲一下其他的操作,如果我想把这个字典数据key和value都输出,可以print(school.items()),比如我只想要key不要value
print(school.keys())
同样也有,如果我只要value不要key的方法
print(school.values())
然后讲一下setdefault方法,如果我写了代码(这里用第一个例子来说明)
print(student.setdefault('20141346001','whatever'))
因为在student中已经有学号为20141346001的学生了(这个学生名为haisheng),这是会输出haisheng
如果我这样写
print(student.setdefault('20141346008','whatever'))
在student中已经没有学号为20141346008的学生,这时会在student中添加一个新的元素,学号为20141346008,名字为whatever,并且返回新加入的value值,上面的语句输出的结果为whatever
最后一个问题,如何在字典中使用循环输出字典元素???这里介绍两种写法
方法一:
for i in student: print(i,student[i])
方法二:
for k,v in student.items(): print(k,v)
这两个方法输出的结果都是
20141346001 haisheng
20141346002 wangzichun
20141346003 weipengxiang
20141346008 whatever
一定是有区别的,否则python创始人也不会把一个功能写两种方式,区别在于方法二是先将字典转变为列表,在去执行,所以如果数据量非常大的话,方法二的时间复杂度和空间复杂度需求更大,而方法一直接可以去数据,所以这里也推荐各位使用方法一。