常用的数据结构—>集合
1.集合定义:
集合的一般定义是“把一定范围的、确定的、可以区别的事物当作一个整体来看待”,集合中的各个事物通常称为集合的元素。集合应该满足以下特性:
- 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。所以Python中的集合肯定不能够支持索引运算
- 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。决定了集合中不能有重复元素。
- 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
2.创建集合
创建集合可以使用 {} 字面量语法,但{}中需要至少有一个元素,因为没有元素的{}并不是空集合而是一个空字典。要创建空集合可以使用 set() 。
注意:集合中的元素必须是 hashable类型。通常不可变类型都是hashable类型,如整数、浮点、字符串、元组等,而可变类型都不是hashable类型,因为可变类型无法确定唯一的ID值,所以也就不能放到集合中。集合本身也是可变类型,所以集合不能够作为集合中的元素。
3.集合的运算
集合类型运算符主要包括:成员运算、交集运算、并集运算、差集运算、比较运算(相等性、子集、超集)等。
(1)成员运算
可以通过成员运算in和not in检查元素是否在集合中,代码如下所示。
(2)交并差运算
跟数学上的集合一样,可以进行交集、并集、差集等运算,而且可以通过运算符和方法调用两种方式来进行操作,代码如下所示。
如果要判断两个集合有没有相同的元素可以使用isdisjoint方法,没有相同元素返回True,否则返回False,代码如下所示。
5. 不可变集合
Python中还有一种不可变类型的集合,名字叫frozenset。set跟frozenset的区别就如同list跟tuple的区别,frozenset由于是不可变类型,能够计算出哈希码,因此它可以作为set中的元素。除了不能添加和删除元素,frozenset在其他方面跟set基本是一样的,下面的代码简单的展示了frozenset的用法。
6.总结
1.列表、元组、字符串:顺序存储(有下标)
优点:随机存储,随机访问
缺点:查找效率低
2.集合:
(1)哈希(散列)存储(hash),是高效率的存储方案
(2)哈希存储的关键是设计一个好的哈希函数,让不同的对象尽可能的产生不同的哈希码
(3)集合在元素查找时效率远高于列表(列表是顺序存储),不依赖问题的规模, 是一种常量级时间复杂度的存储方案
(4)如果一个对象无法计算哈希码,就不能放到集合中 列表就是无法计算哈希码的对象
3.集合底层使用的是哈希存储,通过计算元素的哈希码来决定元素存储的位置,这是一种高效的存储方案。
4.哈希存储的关键是设计一个好的哈希函数,尽量保存不同的对象能够计算出不同的哈希码。
5.可变容器(列表、集合、字典)都无法计算哈希码,因此都不能放到集合中,作为集合的元素。