映射类型:字典

Published: 29 Dec 2013 Category: 编程

字典类型和序列类型的区别在于存储和访问数据的方式不同。数列类型只保存值,可以将数字类型的顺序索引看作为键。而映射类型可以用其它对象类型作为键,比如数据串。在字典中,我们不用可序列化排序的键,所以映射类型的数据是无序的。

字典的常用操作

创建一个字典的方法有直接整体赋值、使用dict工厂方法和fromkeys函数。

#创建字典
dict1={}
dict2={'name':'earth','port':80}
fdict=dict((['x':1],['y':2]))
ddict={}.fromkeys(('x','y'),-1)#字典中的元素具有相同的value值。

#访问字典
dict2['name']#访问字典中某一元素

for key in dict2.keys():#遍历字典 print 'key=%s,value=%s' %(key,dict2[key])

for key in dict2:#遍历字典,结果同上 print 'key=%s,value=%s' %(key,dict2[key])


如果我们使用一个字典中没有的键去访问字典元素,会产生一个错误。
可以使用`has_key()`和`in`、`not in`来判断字典中是否存在该键。

'server' in dict2 # or dict2.has_key('server') Falser ```

字典中的键不能也无法被改变,而且键的类型必须是可哈希的,如数字和字符串是可哈希的,而列表和其他字典就不是可哈希的。

更新字典操作包括更新条目和添加条目,和传统的map类似,如果key已存在,则更新,否则,添加新条目。

#更新字典
dict2['name']='venus'#更新已有条目
dict2['arch']='sunos5'#添加新条目

删除字典元素和字典使用del语句,还有clear()和pop()函数可以对字典元素进行删除

del dict2['name']#删除条目
dict2.clear()#删除所有条目
del dict2#删除整个字典
dict2.pop('name')#删除并返回条目

映射类型的相关函数

dict()

  • 如果不提供参数,生成空字典
  • 如果提供可迭代参数(序列、迭代器等),每个可迭代元素必须成对出现。
  • 输入参数是另一个映射对象,浅复制版本。和copy()一样,更推荐copy函数

len()

返回字典长度

hash()

返回对象的哈希值 hash()函数并不是为字典设计的,他可以判断某个对象是否可以做一个字典的键。

映射类型的内建方法

has_key()以及in, not in可判断字典中是否存在键

keys():返回一个包含字典中所有的键的列表

values():返回一个包含字典中所有值的列表

items():返回一个包含键、值元组的列表。

以上三个方法在不按任何顺序遍历列表时很有用。

如果需要有序访问,俄可以使用sorted()内建函数,返回一个有序的迭代器。

for key in sorted(dict2):#有序遍历字典
    print 'key=%s,value=%s' %(key,dict2[key])

update()将一个字典的内容添加到另一个字典中。字典中原有的键如果与新添加的键重复,那么更新条目。原不存在的条目添加到字典中。

clear():删除字典中所有的条目。

copy()返回一个字典的副本,这只是一个浅拷贝。

get():方法和操作符[]类似,但是允许为不存在的键提供默认值返回,如果也没有提供默认值,那么返回None。这个方法更加灵活,不用担心引发异常。

setdefault():检查字典中是否含有某键,如果存在,取该值;如果不存在,给这个键赋值并返回该值。

还有iteritems(),iterkeys(),itervalues()作为惰性赋值的迭代,可以处理数据集很大的情况。

字典的键

不允许一个键对应多个值。

键必须是可哈希的:不可变类型都是可哈希的。