dic字典
字典是键值对的无序可变序列
键是任意不可变数据(tuple,整数,浮点数,字符串),不可重复
创建
1 通过{},dict创建
>>> d = {
... 'Alice': 45,
... 'Bob': 60,
... 'Candy': 75,
... 'David': 86,
... 'Ellena': 49
... }
>>> d
{'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
>>> L = [('Alice',45),('Bob',60),('Candy',75),('David',86),('Ellena',49)]
>>> d = dict(L)
>>> d
{'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
2 通过zip()创建字典对象
>>> k=['Alice', 'Bob', 'Candy', 'David', 'Ellena']
>>> j=[45, 60, 75, 86, 49]
>>> d=dict(zip(k,j))
>>> d
{'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
3 通过fromkeys()创建值为空的字典
>>> e=dict.fromkeys(['Alice', 'Bob', 'Candy', 'David', 'Ellena'])
>>> e
{'Alice': None, 'Bob': None, 'Candy': None, 'David': None, 'Ellena': None}
访问
1 通过键获得值
键不存在,抛出异常
>>> d = {'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
>>> d['Bob']
60
>>> d['Mary']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Mary'
2 通过get()方法获得值
键不存在,不会报错
>>> d.get('Candy')
75
>>> d.get('Mary')
3 列出所有的键值对
>>> d.items()
dict_items([('Alice', 45), ('Bob', 60), ('Candy', 75), ('David', 86), ('Ellena', 49)])
4 列出所有的键 列出所有的值
>>> d.keys()
dict_keys(['Alice', 'Bob', 'Candy', 'David', 'Ellena'])
>>> d.values()
dict_values([45, 60, 75, 86, 49])
5 len()键值对的个数
>>> len(d)
5
6 检测一个键是否在字典中
>>> 'Alice' in d
True
元素添加
1 新增键值对
若原先存在键,则覆盖值
>>> d['Alice']=55
>>> d
{'Alice': 55, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
2 update()
将字典中所有值全部添加到旧字典对象上。若key重复则进行覆盖
>>> a = {'Alice': 55, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
>>> b = {'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Dodo':65}
>>> a.update(b)
>>> a
{'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49, 'Dodo': 65}
元素删除
d = {'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
1 del()
删除指定键值对
>>> del(d['Alice'])
>>> d
{'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
2 pop()
删除指定键值对并返回值
>>> d = {'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
>>> di=d.pop('Alice')
>>> di
45
>>> d
{'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
3 clear()
删除所有键值对
>>> d.clear()
>>> d
{}
4 popitem()
随机删除和返回该键值对
>>> d.popitem()
('Ellena', 49)
>>> d
{'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86}
>>> d.popitem()
('David', 86)
>>> d
{'Alice': 45, 'Bob': 60, 'Candy': 75}
序列解包
可以用于元组,列表,字典
方便对多个元素赋值
元组,列表
>>> x,y,z=(30,10,20)
>>> x
30
>>> T=x,y,z
>>> T
(30, 10, 20)
>>> a,b,c=[50,70,30]
>>> a
50
>>> L=a,b,c
>>> L
(50, 70, 30)
字典
>>> d = {'Alice': 45, 'Bob': 60, 'Candy': 75, 'David': 86, 'Ellena': 49}
>>> one,two,three,four,five = d #默认对键进行操作
>>> one
'Alice'
>>> one,two,three,four,five = d.items() #对键值对进行操作
>>> one
('Alice', 45)
使用字典和列表储存表格数据
>>> r1={'name':'m1','age':'18'}
>>> r2={'name':'m2','age':'16'}
>>> r3={'name':'m3','age':'17'}
>>> tb=[r1,r2,r3]
>>> tb[0].get('name')
'm1'
>>> for i in range(len(tb)):
... print(tb[i].get('age')
...
18
16
17
字典核心底层原理
字典对象的核心是散列表
散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单位叫做bucket
每个bucket结构和大小一致,可以通过偏移量来读取指定bucket
>>> a={}
>>> a['name']='mi'
>>> a
{'name': 'mi'}
>>> bin(hash('name'))
'0b110001010010100000111100010100101011111111100011001000110011011'
以下来自: