字典
1.1 字典含义
- 字典是一种可变类型,可存储任意类型对象,字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号,可哈希的类型可以作为键,不可哈希的类型不能作为键(list, dict等)
1.2 字典实现原理
- 在Python中,字典通过哈希表实现的,使用开放寻址法解决冲突。
- 哈希表是一种key-value类型的数据结构,字典的每一个键都占用一个单元,一个单元分为两部分,分别是对键的引用和对值的引用,使用hash函数获取键的散列值,散列值对数组长度取余,取得值就是存放位置的索引
1.3 hash算法和哈希冲突
- 哈希算法
根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到有限的地址区间上的算法,称之为散列算法,杂凑算法
- 哈希表
数据经过哈希算法之后得到的集合。
- 哈希冲突
由于哈希算法被计算的数据是无限的,而计算后的算法是有限,因此总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突,通俗来说就是key冲突了
1.4 解决哈希冲突的方法
- 开放定址法
从发生冲突的那个单元起,按照一定次序,从哈希表找到一个空闲的单元,然后把发生冲突的元素存入到该单元的一种方法。
- 链地址法
将哈希值相同的元素构成一个同义词的单链表,并将单链表的头指针存放在哈希表的第i个单元中,查找、插入和删除主要在同义词链表中进行
- 再哈希法
同时构造多个不同的哈希函数
- 建立公共溢出去
将哈希表分为公共表和溢出表,当溢出发生时,将所有溢出的数据统一放到溢出区
1.5 常用操作
new_dict = {"name": "zhangsan", "age": 18}
# 增加
new_dict["height"] = 180
输出:{"name": "zhangsan", "age": 18", "height": 180}
# del 删除指定键值对,若key不存在,则会抛出KeyError错误
del new_dict["name"]
输出:{"age": 18}
# pop 删除指定键值对,返回被删除的值
a = new_dict.pop["name"]
输出:zhangsan
# setdefault 键值对不存在,添加键值对,存在则不做处理
new_dict.setdefault("weight", "60kg")
输出:{'name': 'zhangsan', 'age': 18, 'weight': '60kg'}
# update 更新指定键的值,如果键不存在,则会添加键值对
new_dict.update(name="lisi")
输出:{'name': 'lisi', 'age': 18}
# 查询 字典.get(键)
new_dict.get("name")
输出:zhangsan
# items 获取所有的键值对
for key, val in new_dict.items():
print(key, val)
输出:name, zhangsan
age, 18
1.6 创建有序字典
# 由于字典是无序的,如果想要创建一个有序字典,可以使用OrderDict,当有新元素插入的时候,会放到链表的尾部
from collections import OrderedDict
sort_dict = OrderedDict()
sort_dict["bar"] = 2
sort_dict["non"] = 8
sort_dict["sek"] = 5
输出:OrderedDict([('bar', 2), ('non', 8), ('sek', 5)])
# 字典排序,按照键排序
new_dict = {"b":3, "a":4, "c":2, "d":10}
sort_dict = sorted(new_dict.items(), key=lambda i: i[0])
输出:[('a', 4), ('b', 3), ('c', 2), ('d', 10)]