与序列不同,字典的索引不是根据元素的位置来确定的,字典的索引称为键(key),字典內的键是唯一的,可以是任何不可变的数据类型,除了一般的数据类型,数字,字符串,还可以是元组等但是若元组包含可变类型,则是不能作为key的。也就是说,键是不能被改变的,只要是不会被改变的数据类型就可以作为键,键的次序取决于添加的顺序,例如:
>>> d = {(1,2,3):'1',(4,5,6):'2'}
>>> d
{(4, 5, 6): '2', (1, 2, 3): '1'}
>>> d.keys()
dict_keys([(4, 5, 6), (1, 2, 3)])
>>> d.setdefault((1,2,3,[1,2,3]),'3') #当键內包含可变类型,例如列表时,则不能作为键
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
d.setdefault((1,2,3,[1,2,3]),'3')
TypeError: unhashable type: 'list'
字典的键值对用花括号 ‘ { } ’ 包含。
通过dict函数构造:
>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True
字典的推导方式,即利用任何以键值对作为元素的可迭代元素对象构建字典:
>>> info = [('name','gzy'),('sno','2016309'),('sex','male'),('age',21),('major','cs')] #一个承载成对数据的列表,可以直接用在列表的构造方法中
>>> d_info = {recode:value for recode,value in info}
>>> d_info
{'name': 'gzy', 'major': 'cs', 'sno': '2016309', 'sex': 'male', 'age': 21}
当然也可以用两个独立的可迭代对象分别作为字典的键集合,值集合,间接地来构造一个键值对应的字典,例如:
>>> recodes
('name', 'major', 'sno', 'sex', 'age')
>>> values
('gzy', 'cs', '2016309', 'male', 21)
>>> nd_info = {(r,v) for r in recodes for v in values}
>>> nd_info
{('sex', 'cs'), ('name', '2016309'), ('major', 'male'), ('sno', 'cs'), ('name', 'cs'), ('sno', 'gzy'),
('sno', 21), ('sex', 'male'), ('major', '2016309'), ('age', 'male'), ('sex', 'gzy'), ('sex', 21),
('major', 'gzy'), ('major', 'cs'), ('name', 'gzy'), ('age', '2016309'), ('name', 21), ('name', 'male'),
('sno', 'male')}
>>> len(nd_info)
25
从·上面的例子可以看到,并没有得到我们想要的字典,而是得到了一个通过笛卡尔积生成的字典,要想使键值匹配,我们可以做这样一个筛选:
>>> nd_info = {(r,v) for r in recodes for v in values if recodes.index(r) == values.index(v)}
>>>> nd_info
{('age', 21), ('major', 'cs'), ('sno', '2016309'), ('name', 'gzy'), ('sex', 'male')}
>>>> type(nd_info) #查看nd_ifno的类型,是集合(set)类型
<class 'set'>
>>> nd_info
>>> info = {r:v for r,v in nd_info} #可以利用上面的方法构造字典
>>> indo
{'sno': '2016309', 'major': 'cs', 'age': 21, 'sex': 'male', 'name': 'gzy'}
>>> type(info)
<class 'dict'>
字典含有众多方法,其中也有很多通用的方法,例如pop,clear,copy等方法,这些方法根据具体的数据类型,在使用上稍有差别,但是基本的使用方法,和方法的功能基本都是一样的,这里主要介绍字典几个比较特殊和常用的方法:
update:
update用于更新字典,方法的参数可以是一个序列,这个序列是一个可以作为键值对的列表,也可以是一个字典,若要更新的键存在字典中,则对值进行更新;若不存在对应的键,则添加这个键,并用预置的值构建键值对,
>>> info.update([('addr','')]) #用可以作为键值对的列表进行更新,并添加键'addr',值为''
>>> info
{'sno': '2016309', 'sex': 'male', 'age': 21, 'major': 'cs', 'addr': '', 'name': 'gzy'}
>>> info.update({'addr':'xian'}) #用字典进行更新,对已经存在的键'addr'进行更新,用'xian'进行替换
>>> info
{'sno': '2016309', 'sex': 'male', 'age': 21, 'major': 'cs', 'addr': 'xian', 'name': 'gzy'}
setdefault:
我们看看python的参考文档对setdefault方法描述:
setdefault(key[, default])
If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.
我们可以看到,setdefault的功能是查询字典中是否存在指定的键,若存在则返回键值,若不存在,则插入这个键,若提供了默认值则构建对应的键值对,若为提供键值,则值为None,
>>> info.setdefault('dormno')
>>> info
{'sno': '2016309', 'sex': 'male', 'age': 21, 'major': 'cs',
'addr': 'xian', 'dormno': None, 'name': 'gzy'}
>>> info.pop('dormno')
'2336'
>>> info
{'sno': '2016309', 'sex': 'male', 'age': 21, 'major': 'cs', 'addr': 'xian', 'name': 'gzy'}
>>> info.setdefault('dormno','2336')
'2336'
>>> info
{'sno': '2016309', 'sex': 'male', 'age': 21, 'major': 'cs',
'addr': 'xian', 'dormno': '2336', 'name': 'gzy'}
get:用于从字典中获得指定的键的值,若不存在对应的键则无返回值:
>>> info.get('aa')
>>> info
{'sno': '2016309', 'sex': 'male', 'age': 21, 'major': 'cs', 'addr': 'xian', 'dormno': None, 'name': 'gzy'}
>>> info.get('addr')
'xian'
keys可返回字典的键构成的dict_keys,
>>> ks = info.keys()
>>> type(ks)
<class 'dict_keys'>
>>> ks
dict_keys(['sno', 'sex', 'age', 'major', 'addr', 'dormno', 'name'])
>>> ks = list(ks)
>>> ks
['sno', 'sex', 'age', 'major', 'addr', 'dormno', 'name']
>>>
values可返回字典的值构成的dict_values,
>>> vs = info.values()
>>> type(vs)
<class 'dict_values'>
>>> vs = list(vs)
>>> vs
['2016309', 'male', 21, 'cs', 'xian', None, 'gzy']
python通散列表来实现字典的,散列表的单元通常叫表元,在dict的散列表里,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,另一个对值得引用。
在通过键取字典中的值时,pythin会先调用hash()来计算键的散列值,再根据散列值来查找表元,若找到的表元是空的,则会抛出KeyError异常,若不是空的,则表元里会有一对 found_key:found_value,这时python会检验散列值是否相等,相等则返回found_value..
在向字典中添加新的键值对或者进行更新时,也会对键的散列值进行计算,找到相应的表元再进行添加或更新操作。
正是因为字典的实现是通过散列表,所以字典的键的类型必须是可散列的。