day7
一、容器5——集合set
1、定义
对比字典:由一系列键值对组成的可变散列容器
集合:由一系列不重复的不可变类型变量(元组/数/字符串)组成的可变散列容器。
加粗的位置相当于键,也就是说,集合是由一系列键组成的可变散列容器。
2、集合的创建
(1)语法1:集合名={元素1,元素2}
dict01 = {"a": "b", "A": "B"} # 在内存中是无序的 但输出有序
set01 = {"a", "A"} # 在内存中是无序的 输出也无序
(2)语法2:集合名= set(可迭代对象)
list01 = ["zx", "as", "qw", "zx", "as"]
set02 = set(list01)
print(set02) # {'qw', 'zx', 'as'}
1、由此demo可看出,集合可用于去重
2、创建空集合只能用第二种方法set03 = set(),第一种方法只能创建出字典。
3、集合元素的添加
集合名.add(元素) (无序)
set02.add("zhao")
set02.add("zx")
print(set02) # {'qw', 'zx', 'zhao', 'as'}
4、集合的遍历
由于集合不可定位,所以只有一种方法:
for item in set02:
print(item)
5、集合元素的删除
(1)语法1:集合名.remove(“key”)
set02.remove("zx")
print(set02) # 如果不存在会报错,所以可以用ifin判断再执行
(2)语法2:集合名.discard(“key”)
set02.discard("tex")
print(set02) # 如果不存在也不会报错
6、集合的应用
(1)去重
(2)数学运算
set01 = {1, 2, 3}
set02 = {2, 3, 4}
1、交集 &
set03 = set01 & set02
print(set03) # {2, 3}
2、并集 |
set04 = set01 | set02
print(set04) # {1, 2, 3, 4}
3、补集
(1)-
set05 = set01 - set02
print(set05) # {1}
set06 = set02 - set01
print(set06) # {4}
(2)对称补 ^
set07 = set01 ^ set02
print(set07) # {1, 4}
4、子集、超集
set08 = {2,3}
print(set08 < set01)
print(set08 > set01)
# 被包含的是子集 包含别人的是超集
7、集合推导式
list01 = ["zx", "as", "qaw", "zx", "asq"]
set_result = set()
# 将列表中姓名字数为2的存入集合
for i in list01:
if len(i)>2:
set_result.add(i)
简化后:
set_result2 = {i for i in list01 if len(i)>2}
———————————————————————————
二、容器小结
1、种类与特点
存什么 | 可变/不可变 | 序列/散列 | |
---|---|---|---|
字符串 | 字符的编码值 | 不可变 | 序列 |
列表 | 变量 | 可变 | 序列 |
元组 | 变量 | 不可变 | 序列 |
字典 | 键值对 | 可变 | 散列 |
集合 | 键 | 可变 | 散列 |
2、可变与不可变
数据 | 内存分布特征 | 优点 | 缺点 | |
---|---|---|---|---|
可变 | 列表、字典、集合 | 预留空间+自动扩容 | 操作方便 | 占内存 |
不可变 | 字符串、元组、整型、浮点型、布尔型 | 按需分配 | 省内存 | 操作不方便 |
3、序列与散列
特点 | 优点 | |
---|---|---|
序列 | 有顺序,空间连续 | 省内存,操作方便(索引切片) |
散列 | 没顺序,空间分散 | 速度快(哈希算法定位) |
———————————————————————————
三、for循环嵌套
# 外层执行一次,内层执行多次
for r in range(3): # 列
for c in range(5): # 行
print("$", end="")
print()
四、自定义排序算法(重要!!!)
我们目前已经学了三种算法:
(1)变量交换
(2)计算最值
(3)累计运算
接下来的排序算法结合了(1)和(2)
基本操作:
1、让第一个元素是最大(小)值
2、让第二个元素是剩下的最大(小)值
3、让第三个元素是剩下的最大(小)值
…
将下列的列表按降序排列
list01 = [23,14,52,516,314,152]
第一步:
for i in range(1,len(list01)):
if list01[0] < list01[i]:
list01[0], list01[i] = list01[i] , list01[0]
print(list01)
第二步:
for i in range(2,len(list01)):
if list01[1] < list01[i]:
list01[1], list01[i] = list01[i], list01[1]
print(list01)
第三步同理。
由此可见,我们可以在外部再嵌套一层循环来执行。
# 取数据
for j in range(len(list01)-1):
# 作比较
for i in range(j+1, len(list01)):
# 找更大
if list01[j] < list01[i]:
# 则交换
list01[j], list01[i] = list01[i], list01[j]
print(list01)