Skip to content

Latest commit

 

History

History
311 lines (212 loc) · 7.41 KB

105-192411-集合_元素操作_set_add_添加集合元素_remove_删除_pop_clear.sy.md

File metadata and controls

311 lines (212 loc) · 7.41 KB
show version enable_checker
step
1.0
true

集合 -集合概念

回忆

  • 上次复习了字符序列
    • 字符序列和列表、元组一样都属于序列
    • 序列的东西他全能用
      • in
      • 加法、乘法运算
      • 索引
      • 切片
      • index
      • len
      • max
      • min
  • 字符序列其实就是
    • 字符连成的序列
    • 一个个字符连起来成了串
    • 滔滔不绝、川流不息
    • 流动起来
  • 字节序列就是字符串
    • 和列表、元组一样都是有序的
  • 有无序的容器吗??🤔

观察

  • 括号类型
    • 小括号对应的是元组 tuple
      • 不可变的序列
    • 中括号对应的是列表 list
      • 可变的序列
    • 元组 tuple 是只读的序列
  • 大括号对应的是什么数据类型呢?

图片描述

  • set 是什么意思呢?

set 集合

  • set 是集合

图片描述

  • 集合是一个容器类型
    • 无序的
    • 内部元素都不同的
  • 这怎么理解呢?
  • 我们先看看
    • 无序

无序

图片描述

  • set 是一个容器
    • 容器里面的元素是没有顺序的
  • 如何理解内部元素都不同呢?

集合内部元素的唯一性

图片描述

  • 这就是集合容器的两个特点
    • 集合元素没有顺序
    • 每个元素都必须是唯一的
  • 这也是集合和列表、元组不同的地方

添加元素

  • 回忆列表对象如何添加列表项元素

图片描述

  • 集合用什么方法呢?

查询帮助

图片描述

  • 集合用的方法是add

图片描述

  • 如果集合里已经有了这个元素
    • 那么add函数就没有任何效果

添加

  • 这是集合和列表最大的区别

图片描述

  • 这有什么意义么?
    • 比如已经入库的超链接就不用再爬取了
      • 已经收录的元素不用重复收录
  • 集合中的元素都是不同的
    • 相同的就会被合并同类项
  • 集合可以清空吗?

清空元素

  • help(set.clear)

图片描述

  • 这个和列表一样

图片描述

  • 列表 list 是 清空所有的列表项
  • 集合 set 是 清空 所有的集合项
    • 这个有点太猛了
  • 我只想删除某个元素呢?

删除元素

  • 找到删除函数remove
    • 删除指定的集合项元素

图片描述

  • 被删除的必须得是集合的元素
  • 不是的话
  • 就会报错

图片描述

  • 集合 set 的 remove 函数
  • 很像 列表 list 的 remove 函数

对比remove函数

  • 如果 remove 了不存在的元素
    • 都要报错

图片描述

  • 有不报错的方法么?

discard 丢弃

图片描述

  • 有就删掉
  • 没有就忽略
  • 也不报错

图片描述

  • 还有和删除相关的么?

pop 弹出

图片描述

  • 试试

图片描述

  • 如果集合空了
    • 就不能 pop 了
    • 报错
  • 如果集合里有元素
    • 就弹出一个并返回
  • 这pop弹栈函数好像列表也有

对比 pop函数

图片描述

  • 列表总是弹出尾部的元素项
  • 但是集合是没有次序的

图片描述

  • 弹出也和定义次序不相关

    • 这和 list 是不同的
  • pop()在 set、list 中的不同

    • list 是有序的,弹出的是最后一个
    • set 是无序的,随机弹出一个
  • 以上都是集合中元素的增减

  • 有一种集合不能增删改

  • 是什么集合呢?

冰封集合

  • frozenset
  • 构造之后就不能增删改了
  • 就像元组一样
  • 列表可以改,但是元组不行
  • 集合可以改,但冰封集合不行

图片描述

  • 集合可以拷贝吗?

直接赋值

图片描述

  • 直接=赋值
  • 就是把地址赋过去
  • 实际上还是一个集合
  • 想要在内存要两个集合怎么办?

copy

图片描述

图片描述

  • 不过这是一个 shallow 拷贝
  • 浅拷贝
  • 怎么证明呢?

构造

图片描述

  • s1 中有三个元素
    • 数字 1
    • 数字 2
    • 元组(3,4)
  • s2 是 s1 的浅拷贝
  • s2 有自己独立的地址
  • 但是他的元组元素和 s1 的元组
  • 指向了相同的地址空间
  • 这就是浅拷贝
  • 我想要深拷贝
  • 怎么办呢?

深拷贝

图片描述

  • 这个东西看起来也差不多
  • 也没深到那里去啊
  • 为什么深拷贝后 s1 和 s2 中的(3,4)还是指向一个地址空间?
  • 为什么会这样呢?

元组的深拷贝

  • 我们还是需要从根源考虑
  • 元组的深拷贝

图片描述

  • 因为元组是只读的
  • 所以深拷贝和浅拷贝一致
  • 到游乐场验证一下

图片描述

  • 确实如此
  • 那深拷贝的意义在哪里呢?

深拷贝

图片描述

  • 深拷贝一般对于列表是特别有效的
  • 那如果集合中的元组换成列表呢?

集合元素

图片描述

  • 报错了
  • 列表不是 hashable 的元素
  • 所以列表不能作为集合元素
  • 那集合可以作为集合元素么?

集合里的集合

图片描述

  • 同样的集合也不是 hashable 的元素
  • 也不能作为集合元素
  • 所以只有元组能作为集合元素了

图片描述

  • 这就是集合的拷贝细节
  • 集合有没有运算呢?

总结

  • 这次学习了集合
  • 集合有两个特点
    • 里面不能有重复的元素
    • 无序
  • 集合可以
    • 添加 add
    • 清空 clear
    • 指定删除 remove
    • 丢弃 discard
    • 弹出 pop
  • 这就是集合元素的操作
  • 有点类似于列表list
    • 列表如果不能修改就是元组
    • 集合如果不能修改是什么呢?🤔
  • 下次再说 👋