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

              

  • 相关阅读:
    20000+关注,开源两本硬核的原创电子书!
    Tail Latency学习
    Zabbix5.0 监控redis
    JAVA多线程(九) ForkJoin框架
    JAVA多线程(八) Condition源码分析
    程序员英语学习(二) 标点符号对应的英语单词汇总
    linux shell快速入门
    Ubuntu常用指令和快捷键汇总
    Win10常用快捷键汇总
    算法路漫漫(三) 荷兰国旗
  • 原文地址:https://www.cnblogs.com/qxhcpp/p/2516380.html
Copyright © 2020-2023  润新知