python 的内置容器 : 有四个
list (列表) set (集合) tuple(元祖) dict (字典)
set : 集合 { }
Set 的本质还是 Hash 表(哈希,散列表) 的实现 :
正宗的 Hash (散列表)它的特点就是 : 无序,不能重复 !!
定义 set : 有两种方法来 定义(获取) set
# 通过弱数据类型的方式 来定义 set
首先,先了解一个点就是,在 Python 的四种容器里,其中, set 和 dict 都是以 {}
的形式展现的!!!
但是, dict 和 set { } 里面的内容却是不一样的!!
先看一个示例 :
可以看到,我们虽然给 s 定义的是以 { } 的方式(我们想要定义一个 set 但是,
type 函数返回给我们的是一个 dict )
当{ } 里面没有值的时候, 系统是首先默认为 是 dict 类型!!
所以, set 的定义的第一种方式就是 要给 { } 里面直接有值( 因为,set 和 dict { }
里的值是完全不一样的呀!!!)
示例 :
图示即是 set 的第一种定义({ } 里面带了值)。
大家还可以根据上示 看到,我们在最初给 s 赋的值,和最终 s 显示出的值好像不
太一样,我们最初赋的值里面有 两个 16 但是最终显示的只有一个!并且我们的排
序好像也被打破了。
这就对应了 我们最早说的 散列表的特点 : 无序,和 不重复!!
# 第二种定义 : 利用 set 的全局函数
示例 :
这种定义的方式就是 直接 把 set 当做全局函数来定义,直接表明我就是要一个 set
这种方式,就可以解决第一种那样解决不了的——可以定义一个 空set
在这里,在额外提一下 : 我们 Python 的这四个容器里,有的是可以相互转化的,
这个 set { } 是可以接受一些东西的!!
比如 : 线性表 可以转化为 哈希表, 哈希表也可以转化为 线性表!!
示例 : 将 列表 转化为 集合
大家可以发现 : 当给 set 里面传了一个列表的时候,出来的就是一个 set 集合(而
且 这个 set 已经把 列表里的数字重复的已经去掉了!遵循了 哈希表
的规律)
示例 : 将 集合 转化为 列表
这就又转化为 列表了!!
拓展 : 有一道面试题 : 如何去重列表中的重复元素 ?
示例 :
可以发现 : u1 里有大量的 重复值, 而 set 就能去重,并且 ,set 和 list
能够相互转化,所以我们利用 set 来去重!!!
set 的访问 :
# 首先,在前面,我们就讲过, set 它是无序的,所以它的元素也是无序
的,所以它的元素就没有下标的!!
因此,set 是无法访问元素的!!!
set 的遍历 :
# 关于遍历,我们想想,之前的遍历都会用到谁呢 ??
我们目前的知识,关于遍历,最经常使用的 就是 While 和 For 了,
那是不是 While 和 For 都可以用到 我们的 set 集合中去呢 ??
答案是否定的!!
我们清楚 set 是没有元素下标的,但是 While 在遍历的时候是需要 下标
所以,While 是不能用到 set 中去的!!!
# For 循环 遍历 set
示例 :
For 是一种 迭代; 它都可以遍历无序的东西!!
常见方法 :
add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection',
'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove',
'symmetric_difference', 'symmetric_difference_update', 'union', 'update'
我们介绍几个常用 :
add : 添加新元素
示例 :
# 可以看到 添加进去的元素 也是没有什么明显的规律的,并且,我们添加
了一个 set 本身就已经含有的元素 (试着 冲击一下 重复性 )发现也没
报错,但是 set 集合也并没有多了两个一模一样的值!!
clear : 清空 { } 里内容
copy : 复制
示例 :
intersection : 取交集,取相同
示例 :
两个集合!!
取交集 :
difference : 取差集,取不同
示例 :
注 : 注意 bb.difference 和 ss.difference 的区别
union : 取并集,取所有
discard : 删除元素 不报错
同样是给 ( ) 里写要删除的值, 删除后再查看发现确实删除掉了,再次操作一次,
会发现没有报错 !!
remove : 删除元素 会报错
用法相似,但再次删除后会报错!!
pop : 随机删除元素,并且返回删除元素
示例 :
我们发现,pop 删除后返回的元素好像就是按照顺序走的!!
再看示例 :
因此我们得以结论 :
pop 是会按照顺序删除元素并且返回元素的,当集合的内容为空时,再使用pop,
则会报错