集合
定义
- set翻译为集合
- collection翻译为集合类型,是一个较大的概念
- set是一个可变的、无序的、不重复的元素组成的集合
- set的元素要求必须可以hash,目前已学的不可hash的类型只有list、set
- 元素不可以索引
- set可以迭代
set的初始化
- set_1 =set() #表示定义一个空集合set_1
- set_1 =set(iterable) #讲一个可迭代对象的元组添加到set_1这个集合中
set的操作
- add(elem)
增加一个元素到set中,如果元素存在则什么都不做
- update(*others)
合并其他元素到set中,参数others必须是可迭代对象;属于就地修改
- remove(elem)
从set中移除一个元素,元素若不存在,则报keyerror
- discard(elem)
从set中移除一个元素,若不存在则什么都不做
- pop()
移除并返回任意元素。若是空set则返回keyerror
- clear()
移除所有元素,若set很大会引起GC(内存垃圾回收)
- 修改
在set中,要么删除,要么添加,由于set是无序的,只有通过hash值来查找元素,修改就相当于先删除再添加
- 查询
非线性结构,无法索引;除非知道某个值确切再set中,通过hash值来查看
- 遍历
可以迭代所有元素,
- 成员运算符
in和not in判断元素是否再set中,由于是通过hash值来查找的,所以效率为O(1)
set和线性结构
- 线性结构的查询时间复杂度是O(n),随着数据规模增大而增大加耗时
- set、dict(dictionary字典)等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关
- 可hash
- 数值型int、float、complex - bool型True、False - 字符串string、bytes - 元组tuple - None 以上都是不可变类型,成为可hash类型(hashable)
- set的元素必须是可hash的
集合的概念
- 基本概念
- 全集
所有元素的集合。例如正整数集,所有正整数组成的集合
- 子集subset和超集superset
集合A的所有元素都在集合B中,称A是B的子集,B是A的超集
- 真子集和真超集
A是B的子集,且A的元素比B少,则称A是B的真子集,B是A的真超集
- 并集是多个集合合并的结果
- 交集是多个集合的公共部分
- 差集是集合中出去交集外的部分
- 集合运算
1. 并集
将两个集合A和B的所有元素合并到一起,组成的集合叫A和B的并集
- union(*others) 返回和多个集合合并后的新的集合,例:s1.union(s2[,s3])
- '|'运算符重载 等同于union,例:s1|s2[|s3]
- update(*others) 和多个集合合并,就地修改,例:s1.update(s2[,s3])
- '|=' 等同于update,例:s1|= s2 [| s3]
2. 交集
集合A和集合B中所有同时属于A和B的元素组成的集合叫A和b的交集
- intersection(*others) 返回多个集合的交集
- '&' 等同于intersection
- intersection_update(*others) 获取多个集合的交集,就地修改
- '&=' 等同于intersection_update
3. 差集
集合A和B,所有属于A切不属于B的元素组成的的集合
- difference(*othens) 返回多个集合的差集
- '-' 等同于difference
- difference_update(*others)返回多个集合的差集并就地修改
- '-=' 等同difference_update
4. 对称差集
集合A和B,有所欲不属于A和B的交集元素组成的集合称为对称差集
- symmetric_difference(other) 返回另一个集合的差集
- '^' 等同于symmetric_difference
- symmetric_difference_update(other) 获取和另一个集合的差集并就地修改
- '^=' 等同于symmetric_difference_update
- issubnet(other)、<=
判断当前集合是不是另一个集合的子集
- set1 < set2
判断set1是不是set2的真子集
- issuperset(other)、>=
判断当前集合是不是other的超集
- set1 > set2
判断set1是不是set2的正超集
- isdisjoint(other)
当前集合和另一个集合没有交集返回True,有交集返回False
练习
- 随机产生2组10个数字的列表,取值范围[10,20]
- 统计20个数字中有多少个不同的数字
- 2组中,不重复的数字有几个,是什么
- 两组中重复的数字有几个是什么
import random
fst_nums = []
sec_nums = []
for _ in range(10):
fst_nums.append(random.randint(10,20))
sec_nums.append(random.randint(10,20))
print(fst_nums,sec_nums) #created random sequence
print()
fst_nums,sec_nums = set(fst_nums),set(sec_nums)
print(fst_nums|sec_nums)
print(fst_nums ^ sec_nums)
print(fst_nums & sec_nums)
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87627