Python学习笔记之字典
字典是Python语言中唯一的映射类型。字典在某些语言中被称为联合内存或者联合数组。序列是以连续的整数为索引,而字典是以关键字为索引的,关键字可以是任何不可变类型的。
字典(dict)
字典是Python语言中唯一的映射类型。字典在某些语言中被称为联合内存或者联合数组。序列是以连续的整数为索引,而字典是以关键字为索引的,关键字可以是任何不可变类型的。字典类型和序列类型容器类(列表、元组)的区别在于两者的存储和访问数据的方式不同。序列类型只能用数字类型的键,映射类型可以用任何不可变类型的对象,一般情况下是用字符串做键。映射类型中的数据是无序排列的。序列类型用有序的数字键做索引将数据以数组的形式存储。
映射类型通常被称为哈希表是因为字典对象就是哈希类型的。
哈希表中储存的每一条数据叫做一个值(value),是根据与它相关的一个被称为键(key)的数据项进行储存的。哈希表的算法是获取键,对键执行一个叫做哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中来储存值。任何一个值存储的地址皆取决于它的键。我们可以用items()方法得到包含键、值对的元组的列表来排序。
字典的创建
我们可以把字典看作无序的键:值对集合,键必须互不相同,一对大括号{}创建一个空字典。初始化字典时,在大括号内放置一组逗号分隔的键:值对。
>>> dict1 = {}
>>> dict2 = {'name':'Joe','age':20}
>>> dict1,dict2
({}, {'age': 20, 'name': 'Joe'})
字典的访问
我们一般可以通过dictname[key]来访问字典的值对或者通过迭代器来访问。
>>> dict2['age']
20
>>> for key in dict2:
print 'key = %s, value = %s' % (key,dict2[key])
key = age, value = 20
key = name, value = Joe
字典的更新
我们可以通过dictname[key]来更新字典的值对,通过del语句删除某一个键:值对。
>>> dict2['name'] = 'Bob' # 替换条目
>>> dict2
{'age': 20, 'name': 'Bob'}
>>> dict2['sex'] = 'male' # 添加条目
>>> dict2
{'age': 20, 'name': 'Bob', 'sex': 'male'}
>>> del dict2['sex'] # 删除条目
>>> dict2
{'age': 20, 'name': 'Bob'}
字典操作符
字典类型操作符除了不支持拼接(+)和重复(*)这样的操作,其他操作和序列操作几乎一样。
基本操作符
由于字典类型操作符和序列操作符几乎一样,这里不做说明。
>>> dict3 = {'abc':123}
>>> dict4 = {'abc':456}
>>> dict5 = {'abc':123,456:789}
>>> dict6 = {'xyz':123}
>>> dict3 > dict4
False
>>> (dict4 < dict5) and (dict4 < dict6)
True
>>> 'abc' in dict3
True
>>> 'abc' in dict6
False
字典的比较
由于字典的比较比较复杂,所以这里单独说明。对于字典来说,cmp()方法比较的算法是按照先比较字典的长度,再比较字典的键,最后比较字典的值对。
比较字典的长度
如果字典的长度不同,那么用cmp(dict1,dict2)比较大小时,如果字典dict1比dict2长,cmp()返回正值,反之负值。
>>> cmp(dict3,dict5)
-1
>>> cmp(dict5,dict4)
1
比较字典的键
如果字典的长度相同,那么就会按照字典的键比较。
>>> cmp(dict3,dict6)
-1
比较字典的值对
如果字典的长度和键都相同的情况下,就会按照字典的值对进行比较。
>>> cmp(dict3,dict4)
-1
hash()函数
hash()函数本身并不是为字典设计的方法,但它可以判断某个队形是否可以做一个字典的键,将一个 对象作为参数传递给hash(),会返回这个队形的哈希值。只有这个对象是可哈希的,才可以作为字典的键。非可哈希类型传递给hash()方法,会产生TypeError错误。
>>> hash(['abc'])
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
hash(['abc'])
TypeError: unhashable type: 'list'
>>> hash(('abc',))
594755148
字典的内建方法
- dict.keys() 返回一个包含字典中键的列表
- dict.values() 返回一个包含字典中所有值得列表
- dict.items() 返回一个包含字典中键、值对元组的列表
- dict.update(dict1) 将字典dict1的键-值对更新到字典dict中,字典中原有的键如果和新添加的键重复,那么重复键所对应的值对将会覆盖原来的值对,原来不存在的条目将会添加到字典中
- dict.iter*() iteritems()、iterkeys()、itervalues()返回的是一个迭代子,而不是一个列表。
代码:
>>> dict1 = {'age': 20, 'name': 'Bob', 'sex': 'male'}
dict2 = {'name': 'Steven','city':'New York','age':24}
>>> dict1.values()
[20, 'Bob', 'male']
>>> dict1.keys()
['age', 'name', 'sex']
>>> dict1.update(dict2)
>>> dict1
{'city': 'New York', 'name': 'Steven', 'age': 24, 'sex': 'male'}
>>> for value in dict1.itervalues():
print value
Steven
19
female
>>> for key in dict1.iterkeys():
print key
name
age
sex
>>> for item in dict1.iteritems():
print item
('name', 'Steven')
('age', 19)
('sex', 'female')