【转】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')