[python学习笔记]字典,当索引不好用时
我们知道,如果只是想将值分组到一个结构中,并且通过编号对其引用,那么列表就完全能够做到。
但如果想通过名字来引用具体的值,像函数映射,那就要用到字典了,字典是python中唯一内建的映射类型,字典的值并没有特殊的顺序,但都存储在一个特定的KEY里。
1.创建字典格式:
phonebook={'alice':'1233','':'','':'',}.显然字典是有多个键和他相对的值组成的对构成,键和值之间用冒号分开,字典外部由两个大括号标识。
2.基本的字典操作:
len(d),返回d中项的数量。
d[k],关联到键K上的值。
d[k]=v,给键k赋值。
del d[k],删除键K。
k in d 检查d中是否有键为k的项。
3.关于字典和列表的区别,仔细看下面这个小例子
>>> x=[] >>> x[21]='hello' Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range >>> x={} >>> x[21]='hello' >>> x {21: 'hello'}
列表不可以在空的21位置上添加字符串,但字典就完全可以。
4. 字典的应用及查询,可以看下面这个例子
首先字典中可以嵌套,注意嵌套的格式,然后就是if elif 的用法。
people={ 'zhangsan':{ 'phone':'1234', 'addr':'shandong' }, 'lisi':{ 'phone':'2222', 'addr':'jinan' }, 'wanwu':{ 'phone':'3333', 'addr':'anhui' } } labes={'phone':'phone number', 'addr':'address' } name=raw_input('name:') request=raw_input("phone number(p)or address(a)?") if request=='p':key='phone' elif request=='a':key='addr' else : print 'you request is error please quit' if name in people:print "%s 's %s is %s."%(name,labes[key],people[name][key]) else : print 'you name is error please quit'
字典方法
1,clear方法,用来清空字典中的所有项,这是个原地操作,无需返回值,当然也可以说返回None,但其实我们在学习中的值,如果要将字典清空,可以直接付给他一个空值即可,比如字典d,我们只需要令d={},即可将d中原有的记录清空,这么看来clear方法似乎多此一举了。但其实并非如此,假设我们定义了x={},再将y=x,然后将x赋值x={'name':'zhangsan','age'=23},此时y也有了和x一样的键值,我们这次要清空x,y。如果只执行x={}这一条语句,则y中的记录并不会受到影响。这就是clear方法的好处,如果前面只执行clear方法,则y中的记录会一块被清除。因为这两种情况下x,y对应的是一个字典。
2,copy方法和深copy方法
copy方法用来实现字典之间的复制,分为浅copy和深copy之说,先看浅copy,假设我们定义了字典x={'name':'zhangsan','skill':['football','sing','reading']},此时执行y=x.copy(),方法,则可将x复制给y,但如果此时将y中的值进行替换比如执行y[‘name’]='username'.此时字典y发生了改变,而x则不变,但如果y仅仅执行修改而不是替换操作,就会将原始字典x中的值也改变,比如y['skill'].remove('reading')。也就是说替换和改变将会对原字典造成两种不同的结果。为了防止修改会对原字典造成影响,我们一般使用深复制,deepcopy。看下面这段程序即可理解深复制的用法。
>>>from copy import deepcopy >>> d={} >>> d['name']=['zhangsan','lisi'] >>> c=d.copy() >>> d {'name': ['zhangsan', 'lisi']} >>> c {'name': ['zhangsan', 'lisi']} >>> dc=deepcopy(d) >>> dc {'name': ['zhangsan', 'lisi']} >>> d['name'].append('wangwu') >>> c {'name': ['zhangsan', 'lisi', 'wangwu']} >>> dc {'name': ['zhangsan', 'lisi']}
3,fromkeys方法,使用给定的键值建立新的字典,每个默认对应的值为None,比如d.fromkeys['name','age'].这样建立起来的字典,仅有键而相应键值则默认为None.当然也可以提供自己的默认值,d.fromkeys(['name','age'],'(unknown)')则默认值为unknwon
4.get方法,是个更为宽松的访问字典项的方法,一般来说,如果试图访问字典中不存在的项时会出错,但调用get方法时之会返回一个none。
5.has_key,顾名思义,检查字典中是否有相应的键,跟表单式的in差不多,d.has_key(k)。返回值是ture或者false。
6.items和iteritems,items方法是将所有的字典项以列表的形式返回,这些列表项中的每一项都来自于(键,值)但是项在返回时并没有特殊的顺序。
7.keys和iterkeys,keys方法将字典中的键以列表的形式返回。仅返回键。而iterkeys则返回键的迭代器。
8.pop,类似数据结构的出栈操作。比如d={'x':1,'y':2,'z':3}.则执行d.pop(x),返回值为x对应的值,并且这个值将从字典d中删除。此时在做d的显示可以发现只有两项。
9.popitem方法弹出随机的项,并将其删除。
10.setdefult方法,在某种程度上类似于get方法,能够获得与给定键相关联的值。
11.update方法,可以利用一个字典项更新另一个字典项。提供字典中的项将会被添加进去,如果有相同的键则会被覆盖。
12.values方法返回字典中的值,与返回列表不同的是返回字典的值可以包含不同的元素,对比keys方法,返回的是字典的键。