python3 核心数据类型--字典

【转】http://blog.csdn.net/fhd001/article/details/6898076
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中,当最后一次引用对象后(例如,将这个变量用其他的值进行赋值),这个对象所占用的内存空间将会自动清理掉:
[list=1]
[*]>>>rec = 0
[/list]
从技术来说,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')