python之字典

妖精的绣舞 提交于 2019-12-02 11:39:44

字典

字典是‘键值对’的无序可变序列,字典中的每个元素都是一个‘键值对’

包含:‘键对象’和‘值对象’

可以通过‘键对象’实现快速获取、删除、更新对应的‘值对象’。

字典中通过‘键对象’找到对应的‘值对象’。

‘键’是任意的不可变的数据,比如:整数、浮点数、字符串、元组。
但是:列表、字典、集合这些可变对象,不能作为‘键’。
并且‘键’不可重复。

一个典型的字典的定义方式:
a = { ‘name’:‘luominmin’,‘age’:15,‘job’:‘teacher’ }

字典创建

1.通过{}、dict ()来创建字典对象

>>> a = { 'name':'wutian','age':17 }
>>> a
{'name': 'wutian', 'age': 17}
>>> b = dict ( name = 'wutian',age = 17 )
>>> b
{'name': 'wutian', 'age': 17}
>>> b = [ ( 'name','wutian' ),( 'age',17 ) ]
>>> b
[('name', 'wutian'), ('age', 17)]

2.通过zip()来创建字典对象

>>> d = dict ()
>>> m = [ 'name','age' ]
>>> n = [ 'wutian',17 ]
>>> d = dict ( zip ( m,n ))
>>> d
{'name': 'wutian', 'age': 17}

3.通过 fromkeys 创建值为空的字典

>>> a = dict.fromkeys ( [ 'name','age'] )
>>> a
{'name': None, 'age': None}

字典元素的访问

1.通过[键]获得‘值’。若键不存在,则抛出异常。

>>> a = { 'name':'wutian','age':17 }
>>> a [ 'name' ]
'wutian'
>>> a [ 'sex' ]
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    a [ 'sex' ]
KeyError: 'sex'

2.通过get()方法获得‘值’,推荐使用。优点是:指定键不存在,返回None;也可以指定键不存在时默认返回的对象。推荐使用get()获取‘值对象’。

>>> a = { 'name':'wutian','age':17 }
>>> a.get( 'name' )
'wutian'
>>> a.get ( 'sex' )
>>> print ( a.get ( 'sex' ))
None
>>> a.get ( 'sex','男' )
'男'

3.items()方法列出所有的键值对

>>> a = { 'name':'wutian','age':17 }
>>> a.items ()
dict_items([('name', 'wutian'), ('age', 17)])

4.keys()列出所有的键,values()列出所有的值

>>> a = { 'name':'wutian','age':17 }
>>> a.keys()
dict_keys(['name', 'age'])
>>> a.values()
dict_values(['wutian', 17])

5.len()键值对的个数

>>> a = { 'name':'wutian','age':17 }
>>> len ( a )
2

6.检测一个‘键’是否在字典中

>>> a = { 'name':'wutian','age':17 }
>>> 'name' in a
True

**字典元素添加、修改、删除

1.给字典新增‘键值对’。如果‘键’已经存在,则覆盖旧的键值对;如果‘键’不存在,则新添‘键值对’。

>>> a = { 'name':'wutian','age':17 }
>>> a [ 'job' ] = 'teacher'
>>> a
{'name': 'wutian', 'age': 17, 'job': 'teacher'}
>>> a [ 'job' ] = 'student'
>>> a
{'name': 'wutian', 'age': 17, 'job': 'student'}

2.使用update()将新字典中所有键值对全部添加到就字典对象上。如果key有重复,则直接覆盖。

>>> a = { 'name':'wutian','age':17 }
>>> b = { 'a':'天下','b':666 }
>>> a.update (b)
>>> a
{'name': 'wutian', 'age': 17, 'a': '天下', 'b': 666}

3.字典中元素的删除,使用del()方法;或者使用clear()删除所有的键值对;pop()删除指定键值对,并返回对应的’值对象‘。

>>> a = {'name': 'wutian', 'age': 17, 'a': '天下', 'b': 666}
>>> del ( a [ 'a' ] )
>>> a
{'name': 'wutian', 'age': 17, 'b': 666}
>>> b = a.pop( 'name' )
>>> b
'wutian'
>>> a
{'age': 17, 'b': 666}
>>> a.clear()
>>> a
{}

4.popitem():随机删除和返回该键值对。字典是’无序可变序列‘,因此没有第一个元素、最后一个元素的概念;popitem弹出随机的项,因为字典并没有’最后的元素‘或者其他有关顺序的概念。若想一个接一个的移除并处理项,这个方法就非常的有效(因为不用首先获取键的列表)。

>>> a = {'name': 'wutian', 'age': 17, 'a': '天下', 'b': 666}
>>> a.popitem()
('b', 666)
>>> a
{'name': 'wutian', 'age': 17, 'a': '天下'}
>>> a.popitem()
('a', '天下')
>>> a
{'name': 'wutian', 'age': 17}

序列解包

序列解包可以用于元组、列表、字典。序列解包可以让我们方便的对多个变量赋值。

>>> x,y,z = 10,20,30
>>> x
10
>>> ( a,b,c ) = ( 10,20,30 )
>>> a
10
>>> b
20

序列解包用于字典时,默认是对’键‘进行操作;如果需要对键值对操作,则需要使用items();如果需要对’值‘进行操作,则需要使用values()。

>>> s = {'name': 'wutian', 'age': 17, 'a': '天下', 'b': 666}
>>> a,b,c,d = s
>>> a
'name'
>>> m,n,w,v = s.values ()
>>> m
'wutian'
>>> h,i,g,k = s.items()
>>> h
('name', 'wutian')
>>> h [ 1 ]
'wutian'

字典核心底层原理

字典对象的核心是散列表。

散列表是一个稀疏数组 (总是有空白元素的数组),数组的每个单元叫做bucket,每个bucket有两部分:一个是键对象的引用,一个是值对象的引用。

由于,所有bucket结构和大小一致,可以通过偏移量来读取指定bucket。

将一个键值对放进字典的底层过程
通过哈希算法计算键的散列码
从末尾开始每三位二进制数对应十进制数的bucket序号
确定序号后查找bucket中是否已有键,如没有,就将键放入bucket中
如果已有键,就再左移三位二进制查找对应的序号,直到空bucket放入

根据查找’键值对‘的底层过程

仍然计算键对象的散列值
对应的末尾三位二进制的bucket序号
找到序号后,提取其中的键对象,对这个键对象进行哈希计算
然后对比两个散列值是否相等,相等就是正确的键对象

用法总结
1、键必须可散列
(1)数字、字符串、元组,都是可散列的。
(2)自定义对象需要支持下面三点:
一、支持hash()函数
二、支持通过__eq__()方法检测相等性
三、若a == b为真,则hash(a)= =hash(b)也为真。
2、字典在内存中开销巨大,典型的空间换时间
3、键查询速度很快
4、往字典里面添加新键可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字典的同时进行字典的修改。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!