4.1 字典的使用

    字典这个名称已经给出了有关这个数据结构功能的一些提示:一方面,对于普通的书来说,都是按照从头到尾的顺序进行阅读,如果愿意,也可以快速翻到某一页,这有点像python的列表,

另一方面,现实中的字典及在python中的字典都进行了构造,从而可以轻松查到某个特定的词语(键),从而找到它的定义(值)。

    某些情况下,字典比列表更加适用,比如:

    表征游戏棋盘的状态,每个键都是由坐标值组成的元组;

    存储文件修改次数,用文件名作为键;

    数字电话/地址簿。

    假如有一个人名列表如下:

    >>>names = ['Alice','Beth','Cecil','Dee-Dee','Earl']

    如果要创建一个可以存储这些人的电话号码的小型数据库,应该怎么做呢?一种方法是简历一个新的列表。假设值存储四位的分机号码,那么可以得到与下面类似的列表:

    >>>numbers = ['2341','9102','3158','0142','5551']

    建立了这些列表后,可以通过如下方式查找到Cecil的电话号码:

    >>>numbers[names.index('Cecil')]

    >>>3158

4.2 创建和使用字典

    字典可以通过下面的方式创建:

    phonebook ={'Alice':'2341','Beth':'9102','Cecil':'3258'}

    字典由多个键及其对应的值构成的对组成(我们也把键/值称为项)。在上例中,名字是键,电话号码是指。每个键和它的值之间用冒号隔开,项之间用逗号隔开,而整个字典是由一对

大括号括起来。孔子点(不包括任何项)由两个大括号组成,像这样:{}。

    注意:字典中的键是唯一的(其他类型的映射也是如此),而值不唯一。

4.2.1 dict函数

    可以用dict函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典。

    >>>items = [('name','Gumby'),('age',42)]

    >>>d=dict(items)

    >>>d

    {'age':42,'name':'Gumby'}

    >>>d['name']

    'Gumby'

    dict函数也可以通过关键字参数来创建字典,如下例所示:

    >>>d =dict(name='Gumby',age=42)

    >>>d

    {'age':42,'name':'Gumby'}

    这可能是dict函数最有用的功能了,但是还是以映射作为dict函数的参数,以建立期项与映射相同的字典(如果不带任何参数,则dict函数返回一个新的空字典,就像list,tuple以及str等函数一样)。

如果另一个映射也是字典(毕竟这一函数内建的映射类型)也可以使用本章稍后降到的字典方法copy。

4.2.2 基本字典操作

    字典的基本行为在很多方面与序列(sequence)类似:

    len(d)返回d中项(键值对)的数量;

    d[k]返回关联到键k上的值;

    d[k]=v将值v关联到键k上;

    del d[k]删除键为k的项;

    k in d检查d中是否有含有键为k的项。

    尽管字典和列表有很多特性相同,但也有下面一些重要的区别。

    键类型:字典的键不一定为整型数据(但也有可能),也可能是其他不可变类型,比如浮点型(实型),字符串或者元组。

    自动添加:即使那个键期初在字典中并不存在,也可以为他分配一个值,这样字典就会建立新的项。而(在不适用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上。

    成员资格:表达式k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值,而不是索引。

4.2.3 字典方法

    1.clear

    clear方法清除字典中所有的项这是个原地操作(类似于list.sort),所以无返回值(或者说返回None)

    2.copy

    copy方法返回一个具有相同键值对的新字典(这个方法实现的是浅copy,因为值本身就是相同的,而不是副本)

    3.fromkeys

    fromkeys方法使用给他的键建立新的字典,每个键默认对应的值为None。

    >>>{}.fromkeys(['name','age'])

    {'age':None,'name':None}

    刚才的例子中首先构造了一个空字典,任何调用它的fromkeys方法,简历另外一个字典,也可以直接在所有字典的类型dict上面调用方法

    >>>dict.fromkeys(['name','age'])

    {'age':42,'name':'Gumby'}

    如果不想使用None作为默认值,也可以自己提供默认值。

    >>>dict.fromkeys(['name','age'],'(unknown)')

    {'age':'(unknown)','name':'(unknown')'}

    4.get

    get方法是个更宽松的访问字典项的方法,一般来说,如果试图访问字典中不存在的项时会出错

    >>>d={}

    >>>print(d['name'])

    Tranceback (most recent call last):

      File"<stdin>",line 1. in ?

    KeyError:'name'

    而get就不会:

    >>>print(d.get('name'))

    None

    可以看到,当使用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以使用自定义“默认”值,替换None;

    >>>d.get('name','N/A')

    ‘N/A’

    如果键存在,get用起来就像普通的字典查询一样:

    >>>d['name']='Eric'

    >>>d.get('name')

    'Eric'

    上例中使用get方法访问'数据库’实体

    5.items和iteritems

    items方法将所有的字典项以列表方式返回,这些列表项中的每一项都来自于(键值),但是想在返回时并没有特殊的顺序

    >>>d={'name':'allen','age':'28'}

    >>>d.items()

    [('name','allen'),('age','28')]

    iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表

    6.keys和iterkeys

    keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器

    7.pop

    pop方法用来获获得对应于给定键的值,然后将这个简直对从字典中移除

    8.popitem

    popitem方法类似于list.pop,后者会弹出列表的最后一个元素。但不同的是,popitem弹出随机的项,因为字典并没有‘最后的元素’

    9.setdefault

    setdefault方法在某种程度上类似于get方法,就是能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给顶尖的情况下,设定相应的键值

    >>>d ={}

    >>>d.setdefault('name','N/A')

    'N/A'

    >>>d

    {'name':'N/A'}

    可以看到,当键不存在的时候,setdefault返回默认值并且相应地更新字典。如果键不存在,那么就返回与其对应的值,但不改变字典。默认值是可选的,这单和get一样,如果不设定,会默认使用None。

    10.update

    update方法可以利用一个字典项更新另外一个字典:

    11.values和itervalues

    values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不通的是,返回值的列表中可以包含重复的元素

    d = {}

    d[1]=1

    d[2]=2

    d[3]=1

    d.values()

    [1,2,1]

4.3 小结

    本章介绍了如下内容:

    映射:映射可以是任何不改变对象标示元素。最常用的类型是字符串和元组。python唯一内建的映射类型是字典。

    利用字典格式化字符串:可以通过在格式化说明符中包括名称(键)来对字典应用字符串格式化操作。当在字符串格式化中使用元组时。还需要对元组中每一个元素都设定‘格式化说明符’。

在使用字典时,所用的说明符可以比在字典中用到的项少

    字典的方法:字典由很多方法,调用的方法和调用列表以及字符串方法的方式相同。

4.3.1 本章新函数

    dict(seq)        用(键,值)对(或者映射和关键字参数)建立字典

 

posted on 2016-12-06 23:38  金翅大鹏吃唐僧  阅读(154)  评论(0)    收藏  举报