[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方法,返回的是字典的键。

 

          

posted @ 2012-05-30 08:29  明珠交到我手上  阅读(690)  评论(0编辑  收藏  举报