python学习之旅笔记总结:第四章、使用字典

           需要将一系列值组合成数据结构并通过编号来访问各个值时,列表很有用。本章介绍一种可通过名称来访问其各个值的数据结构。这种数据结构称为映射(mapping)。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。

1、字典的用途

          字典的名称指出了这种数据结构的用途。

         在很多情况下,使用字典都比使用列表更合适。下面是Python字典的一些用途:
             表示棋盘的状态,其中每个键都是由坐标组成的元组;
             存储文件修改时间,其中的键为文件名;
             数字电话/地址簿

2 创建和使用字典

       字典由键及其相应的值组成,这种键值对称为项(item)。每个键与其值之间都用冒号(:)分隔,项之间用逗号分隔,而整个字典放在花括号内。空字典(没有任何项)用两个花括号表示,类似于下面这样:{}。

           注意:列表放在【】中,元祖一般由逗号和()组成,而字符串由""或者‘’组成,字典由{}组成

           注意 在字典(以及其他映射类型)中,键必须是独一无二的,而字典中的值无需如此

2.1 函数dict

           可使用函数dict从其他映射(如其他字典)或键-值对序列创建字典

        

         还可使用关键字实参来调用这个函数,如下所示:

          

           注意:以下表述是错误的

             

2.2 基本的字典操作

                字典的基本行为在很多方面都类似于序列。
                 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是一个列表)查找的是值而不是索引。这看似不太一致,但你习惯后就会觉得相当自然。毕竟如果字典包含指定的键,检查相应的值就很容易

                 前述第一点(键可以是任何不可变的类型)是字典的主要优点。第二点也很重要,下面的示例说明了这种差别:

             

             

2.3  将字符串格式设置功能用于字典

            可使用字符串格式设置功能来设置值的格式,这些值是作为命名或非命名参数提供给方法format的。在有些情况下,通过在字典中存储一系列命名的值,可让格式设置更容易些。例如,可在字典中包含各种信息,这样只需在格式字符串中提取所需的信息即可。为此,
必须使用format_map来指出你将通过一个映射来提供所需的信息。

       

              像这样使用字典时,可指定任意数量的转换说明符,条件是所有的字段名都是包含在字典中的键。

2.4 字典方法

            与其他内置类型一样,字典也有方法。字典的方法很有用,但其使用频率可能没有列表和字符串的方法那样高。

2.4.1 clear

            方法clear删除所有的字典项,这种操作是就地执行的(就像list.sort一样),因此什么都不返回(或者说返回None)

             

              

注意:第一张图中使用a={},但是对b没有影响,第二张图中使用a.clear,导致a和b同时清空,原因为:b=a之后相当于a和b都指向一个相同的字典,a={}表示将a指向另外一个为空的字典,但是此时b还是指向原来的有内容的字典;a.clear则是将a指向的字典中的内容清空,由于b也指向同一个字典,故此时a和b都为空

2.4.2 copy

         方法copy返回一个新字典,其包含的键-值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)。

            

           如你所见,当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化,因为原件指向的也是被修改的值

            为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值,等等。为此,可使用模块copy中的函数deepcopy

               

2.4. 3 fromkeys

               方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None

               直接对dict(前面说过,dict是所有字典所属的类型。类和类型将调用方法fromkeys。

              如果你不想使用默认值None,可提供特定的值。

            

2.4.4 get

                方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误。

            

               而使用get不会这样:使用get来访问不存在的键时,没有引发异常,而是返回None。你可指定“默认”值,这样将返回你指定的值而不是None。如果字典包含指定的键,get的作用将与普通字典查找相同。

                

2.4.5 items

              方法items返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。字典项在列表中的排列顺序不确定

               返回值属于一种名为字典视图的特殊类型。另外,你还可确定其长度以及对其执行成员资格检查

                    

2.4.6 keys

            方法keys返回一个字典视图,其中包含指定字典中的键。

           

2.4.7 pop

                       方法pop可用于获取与指定键相关联的值,并将该键值对从字典中删除

                 

2.4.8 popitem

            方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念。如果你要以高效地方式逐个删除并处理所有字典项,这可能很有用,因为这样无需先获取键列表

                    

2.4.9 setdefault

            方法setdefault有点像get,因为它也获取与指定键相关联的值,但除此之外,setdefault还在字典不包含指定的键时,在字典中添加指定的键-值对。                                                                                                           

2.4.10 update

               方法update使用一个字典中的项来更新另一个字典

               

                     对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就替换它

2.4. 11 valus

           方法values返回一个由字典中的值组成的字典视图。不同于方法keys,方法values返回的视图可能包含重复的值。

            

 

3、小结

 映射:映射让你能够使用任何不可变的对象(最常用的是字符串和元组)来标识其元素。Python只有一种内置的映射类型,那就是字典

 将字符串格式设置功能用于字典:要对字典执行字符串格式设置操作,不能使用format和命名参数,而必须使用format_map

 字典方法:字典有很多方法,这些方法的调用方式与列表和字符串的方法相同。
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值