Python字典
SUMUP
定义
字典是“键值对”的无序可变序列
列表中我们通过“下标数字”找到对应的对象,字典中通过“键对象”找到对应的“值
对象”
“键”是任意的不可变数据,比如:整数、浮点数、字符串、元组;“键”不可重复
“值”可以是任意的数据,并且可重复
例子:
a = {‘name’:‘gaoqi’,‘age’:18,‘job’:‘programmer’}
创建
- { } 或dict( )
>>> a={'name':'dog','age':1}
>>> b=dict(name='dog',age=1)
>>> c=dict([('name','dog'),('age',1)])
- zip( )
>>> k = ['name','age','job']
>>> v = ['gaoqi',18,'techer']
>>> d = dict(zip(k,v))
>>> d
{'name': 'gaoqi', 'age': 18, 'job': 'techer'}
- fromkeys,创建值为空的字典
>>> d=dict.fromkeys('name','age')
>>> d
{'n': 'age', 'a': 'age', 'm': 'age', 'e': 'age'}
>>> d=dict.fromkeys(['name','age'])
>>> d
{'name': None, 'age': None}
元素访问
- 通过键获得值:a[‘name’];如果键不存在,报错
- 通过get( )获得;若不存在,返回None或指定值(放在第二位)
- items( ):列出所有键值对
- keys( )、values( ):列出所有键/值
- len( ):键值对个数
- 监测键是否存在:‘name’ in a
元素添加、修改和删除
- 新增键值对;如果存在则覆盖旧的
>>> a={'name':'dog','age':1}
>>> a['name']='cat'
>>> a['pet']=True
>>> a
{'name': 'cat', 'age': 1, 'pet': True}
>>> b={'age':3,'gender':'female'}
>>> a.update(b)
>>> a
{'name': 'cat', 'age': 3, 'pet': True, 'gender': 'female'}
- del( )删除;pop( ) 删除指定键值对并返回值;clear( )删除所有键值对
>>> del(a['gender'])
>>> a
{'name': 'cat', 'age': 3, 'pet': True}
>>> a.pop('age')
3
>>> a
{'name': 'cat', 'pet': True}
>>> a.clear()
>>> a
{}
- popitem( ) :随机删除和返回该键值对;若想一个接一个地移除并处理项,这个方法就非常有效
序列解包
可用于元组、列表、字典,用于对多个变量方便地赋值
例子:
元组:x,y,z=(10,20,30) (或 (x,y,z)=(10,20,30) )
列表:[a,b,c]=[10,20,30]
字典:
>>> a={'name':'dog','age':1,'pet':True}
>>> ## 默认得到键
>>> x,y,z=a
>>> x
'name'
>>> ## 通过values得到值
>>> x,y,z=a.values()
>>> x
'dog'
>>> ## 通过items()得到键值对
>>> x,y,z=a.items()
>>> x
('name', 'dog')
存储表格数据并进行访问
项目 | Value | 价格 |
---|---|---|
电脑 | $1600 | 2 |
手机 | $12 | 3 |
导管 | $1 | 4 |
>>> r1={'name':'computer','price':1600,'amount':2}
>>> r2={'name':'handy','price':12,'amount':3}
>>> r3={'name':'conduit','price':1,'amount':4}
>>> table=[r1,r2,r3]
>>> table
[{'name': 'computer', 'price': 1600, 'amount': 2}, {'name': 'handy', 'price': 12, 'amount': 3}, {'name': 'conduit', 'price': 1, 'amount': 4}]
>>> table[1]['price']
12
>>> table[1].get('price')
12
>>> for i in range(len(table)):
... table[i].get('price')
...
1600
12
1
字典核心底层原理
核心:散列表
散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket,每个bucket有两部分,一个是键对象的引用,一个是值对象的引用
由于所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket
底层过程:
- 放入:计算键值的哈希值,根据这个值计算偏移量,找到偏移量对应为空的bucket放入键值
- 查找:
特点
内存开销大,但查找迅速
往字典里面添加新建可能导致扩容,导致散列表中键的次序变化;因此,不要在遍历字
典的同时进行字典的修改