Python---dictionaries字典

1.字典?

与序列不同,字典的索引不是根据元素的位置来确定的,字典的索引称为键(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'

字典的键值对用花括号 ‘ { } ’ 包含。

2.字典的构建

通过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'>

3.字典常用方法?

字典含有众多方法,其中也有很多通用的方法,例如pop,clear,copy等方法,这些方法根据具体的数据类型,在使用上稍有差别,但是基本的使用方法,和方法的功能基本都是一样的,这里主要介绍字典几个比较特殊和常用的方法:

  • update
  • setdefault
  • get
  • keys
  • values

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']

4.字典内部机理?

python通散列表来实现字典的,散列表的单元通常叫表元,在dict的散列表里,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,另一个对值得引用。
在通过键取字典中的值时,pythin会先调用hash()来计算键的散列值,再根据散列值来查找表元,若找到的表元是空的,则会抛出KeyError异常,若不是空的,则表元里会有一对 found_key:found_value,这时python会检验散列值是否相等,相等则返回found_value..
在向字典中添加新的键值对或者进行更新时,也会对键的散列值进行计算,找到相应的表元再进行添加或更新操作。
正是因为字典的实现是通过散列表,所以字典的键的类型必须是可散列的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值