python3之python的核心数据类型(字典)

python3之python的核心数据类型(字典)
----------
python中的字典是一种 映射(mapping)。映射是一个其他对象的集合,但是它们是 通过键而不是相对位置来存储的。它也 具有可变性---可以就地改变,并可以随需求增大或减小,就像列表那样。

1 映射操作
作为常量编写时, 字典编写在大括号中,并包含一系列的"键:值"对。如例:
>>>D = {'food':'Spam','quantity':4,'color':'pink'}

我们可以通过键对这个字典进行索引来读取或改变键所关联的值。字典的索引操作使用的是和序列相同的语法但是在方括号中的元素是键,而不是相对位置:

>>>D['food']
'Spam'
>>>D['quantity'] += 1
>>>D
{'food':'Spam','color':'pink','quantity':5}
尽管可以使用大括号这种常量形式,最好还是见识一下不同的创建字典的方法。例如,下面开始一个 空的字典然后每次以一个键来填写它与列表中禁止边界外的赋值不同,对一个新的字典的键赋值会创建该键
>>>D = {}
>>>D['name'] = 'Bob'
>>>D['job'] = 'dev'
>>>D['age'] = 40
>>>D
{'age':40,'job':'dev','name':'Bob'}
>>>print(D['name'})
Bob


2 重访嵌套
如例:
>>>rec = {'name':{'first':'Bob','last':'Smith'},
          'job':['dev','mgr'],
          'age':40.5}
在这里,在顶层再次使用了三个键的字典(键分别是'name','job'和'age')。但是值的情况变得复杂得多:一个嵌套的字典作为name的值,支持了多个部分,并用一个嵌套的列表作为job的值从而支持多个角色和未来的扩展。能够获取这个结构的组件,就像之前在矩阵中所做的那样,但是这次索引的是字典的键,而不是列表的偏移量。
>>>rec['name']
{'last':'Smith','first':'Bob'}
>>>rec['name']['last']
'Smith'
>>>rec['job']
['dev','mgr']
>>>rec['job'][-1]
'mgr'
>>>rec['job'].append('jamitor')
{'age':40.5,'job':['dev','mgr','janitor'],'name':{'last':'Smith','first':'Bob'}}
注意这里的最后一个操作是如何扩展嵌入job列表的。 因为job列表是字典所包含的一部分独立的内存,它可以自由地增加或减少。介绍这个例子的真正原因是为了说明python核心数据类型的灵活性。就像你所看到的那样,嵌套允许直接并轻松地建立复杂的信息结构。
同样重要的是,在底层语言中,当我们不再需要该对象时,必须小心地去释放掉所有对象空间。 在python中,当最后一次引用对象后(例如,将这个变量用其他的值进行赋值),这个对象所占用的内存空间将会自动清理掉
>>>rec = 0
从技术来说, python具有一种叫做垃圾收集的特性,在程序运行时可以清理不再使用的内存,并将你从必须管理代码中这样的细节中解放出来。在python中,一旦一个对象的最后一次引用被移除, 空间将会立即回收。我们将会在后面学习这是如何工作的。


3 键的排序:for循环
因为字典不是序列,它们并不包含任何可靠的从左到右的顺序。这意味着如果我们建立一个字典,并将它打印出来,它的键也许会以与我们输入时不同的顺序出现:
>>>D = {'a':1,'b':2,'c':3}
>>>D
{'a':1,'c':3,'b':2}
那么,如果在一个字典的元素中,我们确实需要强调某种顺序的时候,应该怎样做呢? 一个常用的解决办法就是 通过字典的keys方法 收集一个键的列表,使用 列表的sort方法 进行排序,然后使用python的 for循环 逐个进行显示结果。如例:
>>>Ks = list(D.keys())
>>>Ks
['a','c','b']
>>>Ks.sort()
>>>Ks
['a','b','c']
>>>for key in Ks:
    print(key,'=>',D[key])
a => 1
b => 2
c => 3
这是一个有三个步骤的过程,然而,就像我们将会在稍后的章节中看到的那样, 在最近版本的python中,通过使用 最新的sorted内置函数 可以一步完成。sorted调用返回结果并对各种对象类型进行排序,在这个例子中,自动对字典的键排序:
>>>D
{'a':1,'c':3,'b':2}
>>>for key in sorted(D)
    print(key,'=>',D[key])
a => 1
b => 2
c => 3


4 不存在的键:if测试
尽管我们能够通过给新的键赋值来扩展字典,但是获取一个不存在的键值仍然是一个错误。
>>>D
{'a':1,'c':3,'b':2}
>>>D['e'] = 99
>>>D
{'a':1,'c':3,'b':2,'e':99}
>>>D['f']
...error text omitted...
KeyError: 'f'
这就是我们所想要的:获取一个并不存在的东西往往是一个程序错误。但是,在一些通用程序中,我们编写程序时并不是总知道当前存在什么键。在这种情况下,我们如何处理并避免错误发生呢?一个技巧就是 首先进行测试in关系表达式允许我们查询字典中一个键是否存在并可以通过使用python的if语句对结果进行分支处理
>>>'f' in D
False
>>>if not 'f' in D:
    print('missing')
本书稍后将对if语句的通用语法进行更多的讲解,这里所使用的形式很直接:它包含关键字if,紧跟着一个其结果为真或假的表达式,如果测试的结果是真的话将运行一些代码。作为其完整的形式,在默认情况下,if语句也可以有else分句,以及一个或多个elif(else if)分句进行其他的测试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值