集合set
集合,简称集。由任意个元素构成的集体。高级语言都实现了这个非常重要的数据结构类型。Python中,它是可变的、无序的、不重复的元素的集合。
初始化
Init signature: set(self, /, *args, **kwargs) Docstring: set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. Type: type Subclasses: Set, Set, Set
s1 = set()
s2 = set(range(5))
s3 = set([1, 2, 3])
s4 = set('abcdabcd')
s5 = {} # 这是什么?
s6 = {1, 2, 3}
s7 = {1, (1,)}
s8 = {1, (1,), [1]} # ?
元素性质
- 去重:在集合中,所有元素必须相异
- 无序:因为无序,所以不可索引
- 可哈希:Python集合中的元素必须可以hash,即元素都可以使用内建函数hash
- 目前学过的不可hash的类型有:list、set、bytearray
- 可迭代:set中虽然元素不一样,但元素都可以迭代出来。
增加
- add(elem)
增加一个元素到set中
如果元素存在,什么都不做
- update(*others)
合并其他元素到set集合中
参数others必须是可迭代对象
就地修改
s = set()
s.add(1)
s.update((1,2,3), [2,3,4])
删除
- remove(elem)
- discard(elem)
- pop()->item
- clear()
修改
集合类型没有修改。因为元素唯一。如果元素能够加入到集合中,说明它和别的元素不一样。所谓修改,其实就是把当前元素修改成一个完全不同的元素,就是删除加入新元素。
遍历
只要是容器,都可以遍历元素。但是效率都是O(n)。
成员运算符in
print(10 in [1, 2, 3])
print(10 in {1, 2, 3})
上面2行代码,分别在列表和集合中搜索元素。如果列表和集合的元素都有100万个,谁的效率高?
IPython魔术方法
Ipython内置的特殊方法,使用%百分号开头的
% 开头是line magic
%%开头是cell magic,notebook的cell
%timeit statemen
-n 一个循环loop执行语句多少次
-r 循环执行多少次loop,取得最好的结果
%%timeit setup_code
#下面写一行,列表每次都要创建,这样写不好
%timeit(-1 in list(range(100)))
# 下面写一个cell中,写在setup中,列表创建一次
%%timeit l=list(range(1000000)
-1 in l
结果说明,集合性能很好。为什么?
- 线性数据结构,搜索元素的时间复杂度是O(n),随着数据规模增加耗时增大
- set、dict使用hash表实现,内部使用hash值作为key,时间复杂度为o(1),查询时间和数据规模无关,不会随着数据规模增大而搜索性能下降。
可哈希
- 数值型int、float、complex
- 布尔型True、False
- 字符串 string、bytes
- tuple
- None
- 以上都是不可变类型,称为可哈希类型