数据结构 - 字典和集合
一、 字典
- 以键值对存储的数据形式
- 字典原理: 将key关键字作为自变量,通过哈希函数计算出一个整数值,即为该元素的存储地址
- 牺牲空间来节省时间
- 如果地址出现冲突,链接发 / 开放寻址式(Python)
1. 字典的创建
(1) 罗列法
字典名 = {键:值}
(2) dict 关键字
字典名 = dict(key = value)
# 此处key是字符串,不需要加引号,只代表关键字
# 只适用于key为字符串的字典创建
(3)dict+ zip
字典名 = dict(zip(iteral1, iteral2))
(4) .fromkeys
字典名.fromkeys(iteral, [default = None])
# 返回新创建的字典,字典名来自iteral, 字典值同一为default
# 方法一:
>>> a = {1:2, 2:3, 4:23}
# 方法二:
>>> a = dict(age = 12, 性别 = '男')
>>> a
{'age': 12, '性别': '男'}
# 方法三:
>>> m = range(1, 5)
>>> n = ('a', '@', 3)
>>> dict(zip(m,n))
{1: 'a', 2: '@', 3: 3}
>>> dict(zip(n, m))
{'a': 1, 3: 3, '@': 2}
# 方法四:
>>> a = {'a': 1, 3: 3, '@': 2}
>>> a.fromkeys(a, [23,'ed'])
{'a': [23, 'ed'], 3: [23, 'ed'], '@': [23, 'ed']}
>>> a.fromkeys(a.values(), [23,'ed'])
{1: [23, 'ed'], 2: [23, 'ed'], 3: [23, 'ed']}
2. 字典的特点
(1) 键值对是无序的,因此无法通过索引访问;
(2) key值不能重复,重复则update;
(3) key必须是不可变类型
3. 字典的修改
字典名[字典键值] = 字典值
--- 如果有,更新;没有,添加
# 方法一:
>>> a = {1:2, 2:3 4:23}
>>> a['sa'] = 234
>>> a
{1: 2, 2: 3, 'sa': 234, 4: 23}
# 方法二(支持添加和查找,不支持修改):
>>> a = {1:2, 2:3 4:23}
# 没有key,则添加键值对
>>> a.setdefault(34, 's')
's'
>>> a
{1: 2, 2: 3, 4: 23, 34: 's'}
# 如果已有key,不修改value
>>> a.setdefault(2, 's')
3
>>> a
{1: 2, 2: 3, 4: 23, 34: 's'}
# 方法三:
# 有则改,无则添
>>> a = {1: 2, 3: 3, 34: 's'}
>>> b = {'a': 1, 3: 3, 34: '@'}
>>> a.update(b)
>>> a
{1: 2, 34: '@', 3: 3, 'a': 1}
4. 字典的运算
不支持 + * >
支持 == in, is
5. 字典的相关方法
(1) 添加相关
① .fromkeys(seq)
创建同值不同键的字典
② setdefault(key, value)
- 用于给字典追加键值对,如果没有value,
追加key-None键值对
key不存在,追加key-value;
已经存在,不可变value;
③ update((key, default=None)
- 追加字典,对已有key更新,没有追加键值对,适用于多个
(2) 删除相关
① pop(key)
- 删除指定键值对,返回key对应value
② popitem()
- 随机删除键值对,返回被删除的键值对
③ clear
清空字典
(3) 获取相关
get(key, '错误信息')
- 返回value, 如果key不存在,返回指定信息
(4) 复制相关copy
- 所有对象的拷贝都是浅拷贝
6. 字典的遍历
返回迭代器
(1) .keys()
(2) .values()
(3) .items()
7. 字典生成式
{f(x,y) for k,v in iterator}
eg.
# 冒号生成字典
>>> {k:v for k,v in zip([1,2,3,4,5],[3,4,2,1,4])}
{1: 3, 2: 4, 3: 2, 4: 1, 5: 4}
# 不加冒号生成集合
>>> {(k,v) for k,v in zip([1,2,3,4,5],[3,4,2,1,4])}
{(5, 4), (3, 2), (1, 3), (4, 1), (2, 4)}
>>> {k+v for k,v in zip([1,2,3,4,5],[3,4,2,1,4])}
{9, 4, 5, 6}
二、 集合
- value为None的字典
1. 集合的创建
(1) 集合名 = {元素名1, 元素名2, ...}
(2) 集合名 = set(iterator)
# 空集合创建
集合名 = {} --- 空字典
集合名 = set() --- 空集合
2. 集合的特点
(1) 集合元素不重复
(2) 无序
(3) 元素为不可变类型
3. 集合的运算
(1) 无 * +
有 in is == >(父子集判断)
(2) 差集(-),并集(|),交集(&),相对差集(^)
s1 = {'a', 'b', 'c', 'd'}
s2 = {'a', 'd', 'c', 'f', 'g'}
① 差集 --- 在被减数集合但是不在减数集合
>>> s1 - s2
{'b'}
>>> s2 - s1
{'f', 'g'}
②并集 --- 合并去重复
>>> s1 | s2
{'b', 'c', 'd', 'f', 'g', 'a'}
③交集 --- 同时出现
>>> s1 & s2
{'d', 'a', 'c'}
④相对差集 --- 不同时出现
>>> s1 ^ s2
{'b', 'f', 'g'}
(3) 父子集判断( < 、 >)
- 是否存在包含关系
4. 集合的相关方法
(1) 添加类
.add(element)
(2) 删除类
① .remove(element)
有则原地删除,无则报错
② .discard(element)
若有则删除,不存在不报错
③ .pop()
随机删除一个元素,并返回
(3) 复制类型
.copy()
浅拷贝,对象不是原来的对象,和元组类型不一样
(4) 差集(-),并集(|),交集(&),相对差集(^)
s1 = {'a', 'b', 'c', 'd'}
s2 = {'a', 'd', 'c', 'f', 'g'}
① 差集 - difference
>>> s1.difference(s2)
{'b'}
# 带有'_update'代表原地修改
>>> s1.difference_update(s2)
>>> s1
{'b'}
② 交集 - intersection
>>> s1.intersection(s2)
{'d', 'a', 'c'}
③ 并集 - union
>>> s1.union(s2)
{'b', 'c', 'd', 'f', 'g', 'a'}
>>> s1.update()
>>> s1
{'d', 'a', 'b', 'c'}
④ 相对差集 - symmetric_difference
>>> s1.symmetric_difference(s2)
{'b', 'f', 'g'}
⑤ .isdisjoint()
- 判断交集是否为空
⑥ .issubset()
- 判断是否子集
⑦ .issupperset()
- 判断是否父集
5. 集合的遍历
只能通过遍历获得元素,不支持索引
三、 容器类型数据类型转化(list, tuple, dict, set)
> 其他转字典,使用dict关键字方法, dict(a =1, b =2, c=3)
> 字符串、列表、元组转集合,会去除重合元素
如果含有可变类型,则不能朱哪壶·转化为集合