Python学习(6)--字典
1.python字典
python中的字典相当于java中的HashMap类,是一个键值对序列,现在我们来谈谈引入字典的必要性。先看看如果不使用字典,用列表的代码:
- t1=['name','age','gender']
- t2=['lisi',24,'man']
- t3=list(zip(t1,t2))
- print(t3)
代码运行结果如下:
如代码所示zip()函数将t1和t2两个列表压缩成一个列表,列表的中每个元素又是由t1和t2按下标分别组成的元组,如:t1[0]和t2[0]组成t3[0]这个元组,以此类推.通过打印我们可以发现t3[0]=('name','lisi'),以及t3[1]和t[2]的值,但是我们在使用t3[0]这个列表元素时,并不知道t3[0]存储的是一个人的名字,这样写出来的程序就不具有可读性.
再来看看使用字典的代码:
- dic1={'name':'lisi','age':24,'gender':'male'}
- print(dic1)
- print(dic1['name'])
- print(dic1['age'])
- print(dic1['gender'])
如代码所示第一行我们定义了一个字典,可以看到字典室由一个个的键值对组成,即'name','age','gender'是键,'lisi',24,'male'分别是键对应的值,在获取每个键的值时,我们只需知道每个值的键是什么,如我们想知道一个人的名字,只需dic1['name']来获取,这样代码更加可读,我们也无需记住name对应的下标是什么.减少了程序员的记忆负担.
运行结果如下:
还有我们要注意的是python的字典是无序的键值对序列,即python中的元素排序是不分先后的,我们不能像字符串,元组或者列表那样通过下标来获取python中的元素.代码如下:
- dic1={'name':'lisi','age':24,'gender':'male'}
- print(dic1[0])
代码运行结果如下:
发生错误KeyError,说明不能用下标来获取字典元素,只有当字典中有0这个键时,我们才能才可以这样写.
还有一点需要注意的是字典的键或者值可以是一个变量,但是通过键获取对应的值的时候我们不能通过变量名对应的字符串去获取。代码如下:
- name=1
- dic2={name:'lisi','age':24,'gender':'male'}
- print(dic2['name'])
如下是运行结果:
这是因为我们现在使用的键是一个值为1的name变量,而不是一个字符串'name',这一点不要混淆。
正确获取方式如下:
- name=1
- dic2={name:'lisi','age':24,'gender':'male'}
- print(dic2[name])
- print(dic2[1])
运行结果如下:
在这里我们可以使用变量名name或者变量名的值获取键对应的值.
2.构造字典的方式
对于字典的构造方式,方式很多。下面我们来介绍其中比较常见的几种。第一种是字典中的fromkeys()方法,这个方法一般适用于字典多个不同的键,但键对应的值相同的情况.fromkeys方法有两个参数,一个参数为键组成的列表,另一个参数就是键对应的值了.代码如下:
- dic3={}.fromkeys(['a','b'])
- print(dic3)
- dic4={}.fromkeys(['a','b'],1)
- print(dic4)
运行结果如下:
当不指定键对应的值,fromkeys()方法只有一个参数的时候,键对应的值默认为None,如图。
第二种就是使用工厂方法dict(),这个方法只有一个参数,参数为一个序列,这个序列可以包含其他序列,但需要注意的是参数序列包含的序列必须>=2,代码如下:
- dic5=dict((['a',1],['b',2]))#定义一个参数为元组,元组又包含两个列表的字典
- print(dic5)
- dic6=dict((('a',1),['b',2]))#定义一个参数为元组,元组包含一个元组和一个列表的字典
- print(dic6)
- dic7=dict([('b',1),('c',2)])#定义一个参数为列表,列表又包含两个元组的字典
- print(dic7)
代码运行结果如下:
再看下参数序列只包含一个序列的代码:
- dic8=dict((('b',1)))
- print(dic8)
运行结果如下:
错误提示我们:第一个参数序列只长度只有1,需要两个序列,这是因为参数序列只包含一个序列,需要至少两个序列,这一点希望大家注意.
3.字典的增删查改
字典作为python中的数据集合,也是可以对其增删查改的,下面介绍下字典的增删查改对应的方法.
增加或修改一个字典元素:
- dic1={'name':'lisi','age':24,'gender':'male'}
- dic1['tel']='1587335928'#增加一个字典元素,键为'tel',值为'1587335928'
- print(dic1)
- dic1['name']='zhangsan'#修改键为'name'的字典元素值为'zhangsan'
- print(dic1)
对应的打印结果如下:
当通过键为字典的元素赋值时,如果字典中存在这个键,那么就是修改键对应的的值,如果不存在,python会为字典添加这个元素,如dic1['tel']='1587335928',字典中没有'tel'这个键,python会添加'tel':'1587335928'这个键值对元素.
删除或者清空字典,代码如下:
- del(dic1['tel'])#删除键为'tel'的元素
- print(dic1)
- print(dic1.pop('gender'))#删除键为'gender'的元素,pop()方法会返回键为'gender'元素的值
- dic1.clear()#清空字典的所有元素,使之成为一个长度为0的空表
- print(dic1)
- del(dic1)#删除一个列表,讲列表完全从内存中清空
- print(dic1)
运行结果如下:
删除一个字典中的元素,可以使用方法del(),或者字典类的方法pop(),两个方法的不同之处是,pop()方法会返回被删元素键对应的值,而del()方法不会返回值,clear()是清空字典中的所有元素,但是在内存中对象还在,del()方法删除字典则是删除字典对象,删除后内存中不会有被删字典对象,所以程序中打印出现错误.
字典的遍历,代码如下:
- dic1={'name':'lisi','age':24,'gender':'male'}
- for key in dic1:
- print(key)
- for key in dic1:
- print(dic1[key])
- print(dic1.get('tel','error'))
for key in dic1表示遍历字典中所有的键,dic1[key]是获取key对应的值,get()方法是获取键对应的值,参数可以是一个,也可以是两个,如果是一个,则返回对应的值,字典中不存在这个键,返回的是None;如果是两个参数,若字典中存在key对应的值,则返回值,若不存在,则返回第二个参数作为提示,如dic1.get('tel','error'),字典中没有'tel'这个键,则返回'error'.
结果如下图:
下节我们将来介绍python中的逻辑流程控制,最近忙着写课设作业,更新的有点慢,希望大家见谅.