'''
字典是python语言中唯一的映射类型。
映射类型对象里哈希值(键)和指向的对象(值)是一对多的关系。
字典对象是可变的,它是一个容器类型,能存储任意个数的python对象,
其中包括其他容器类型。
字典类型和序列类型容器类(列表、元组)的区别是存储和访问数据的方式不同。
序列类型只用数字类型的键(从序列的开始起按数值顺序的索引)。
映射类型可以用其他对象类型做键;一般最常见的是用字符串做键(key)。
和序列类型的键不同,映射类型的键直接或间接地和存储的数据值相关联。
映射类型中的数据是无序排列的。
什么是哈希表?它们与字典的关系是什么?
序列类型用有序的数字键做索引键数据以数组的形式存储。
一般索引值与所存储的数据毫无关系。
哈希表中存储的每一条数据,叫做一个值,是根据与它相关的一个被称作键的数据项进行存储的。
键和值合在一起被称为"键-值 对"(key-value pairs)。哈希表的算法是获取键,对键执行一个叫做
哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中存储值。
任何一个值存储的地址皆取决于它的键。哈希表中的值是无序的数据集。
所能获得的有序集合只能是字典中的键的集合或者值的集合。
方法keys()/values()返回一个列表,该列表是可排序的。使用items()方法得到包含键、值对的元组的列表排序。
由于字典本身是哈希的,所以是无序的。
创建字典只需要把字典赋值给一个变量,不管这个字典是否包含元素:
dict1={} 或者 dict1={"name":123,"456":789}
从python2.2版本起,可以用工厂方法dict()来创建字典。例如:
fdictinary=dict((['x',254],[456,789]))
从python 2.3版本起,可以用一个很方便的内建方法fromkeys()来创建一个“默认”字典,
字典中元素具有相同的值(如果没有给出,默认为None):
ddict={}.fromkeys(('x','y'),-5)或者不给出键值 ddict={}.fromkeys(('x','y'))
要想遍历一个字典(一般用键),只要循环查看它的键,然后通过以键为索引获取值。
从python 2.2开始,可以不必使用keys()方法获取供循环使用的键值对列表。
可以使用迭代器轻松访问类序列对象,例如字典和文件。
只需要用字典的名字就可以在for循环里遍历字典。
要想获取字典中某个元素的值,可以使用所熟悉的字典键加上中括号来得到。
例如:dict1['x']
如果想访问字典中的一个元素,而该元素在字典中没有对应的键,将会产生一个错误。
检查一个字典中是否有某个键的最好方法是用字典的has_key()方法,或者in、not in操作符。
字典中的键必须是可哈希的,所以数字和字符串可以作为字典中的键,但是列表和其他字典不行。
如果更新字典,以下有几种方式对字典做修改:
1》添加一个新数据项或新元素(即,一个键-值对)
2》修改一个已存在的数据项
3》删除一个已存在的数据项
也可以使用内建方法update()将整个字典的内容添加到另一个字典。
删除整个字典的操作不常见。通常,删除字典中的某个元素(del dict1["name"])或者清除整个字典的内容(dict1.clear())。
也可以使用pop函数,删除并返回键为"name"的条目。dict1.pop("name")
PS:避免使用内建对象名字作为变量的标识符
'''
dict1={}
dict1["name"]="ewang"
dict2={"Name":"ewang","age":28}
dict3=dict()
dict4=dict((["hello","ewang"],["hi","EWANG"]))
dict5={}.fromkeys(("x","y","z"),56)
dict6={}.fromkeys(("x1","y1","z1"))
print dict1
print dict2
print dict3
print dict4
print dict5
print dict6
print "*"*50
for key in dict5.keys():
print "key=%s ,value=%d" %(key,dict5[key])
print "*"*50
print "no call keys function"
for key in dict5:
print "key=%s ,value=%d" %(key,dict5[key])
print "*"*50
print "dict1[\"name\"]=" ,dict1["name"]
print "dict2[\"Name\"]=" ,dict2["Name"]
try:
print "dict2[\"Name\"]=%s" %(dict2['ame'])
except KeyError,e:
print "KeyError:",e
if dict2.has_key("age"):
print "dict2 exitsts the key age"
if "age" in dict2:
print "dict2 exitsts the key age"
if "Age" not in dict2:
print "dict2 not exitsts the key Age"
print "*"*50
dict1["server"]="192.168.111.111"
dict1["port"]=8080
dict2[234]=456
dict2["234"]=456
dict3[3.2]=3.1415926
print dict1
print dict2
print dict3
print "*"*50
dict1["name"]="hello world"
dict1["port"]=8888
print "dict1[\"name\"]=",dict1["name"]
print "dict1[\"port\"]=",dict1["port"]
print "*"*50
del dict2[234]
dict3.clear()
print dict3
del dict3
name=dict1.pop("name")
try:
print dict2[234]
except KeyError,e:
print "KeyError:",e
try:
print dict3
except NameError,e:
print "NameError:",e