内置数据结构set
定义: 可变的、无序的、不重复的元素的集合. 常用于: 去重 set是可迭代对象 set中的元素必须是可hash的 set中的值不能通过索引访问
set定义,初始化
set() -> new empty set object set(iterable) -> new set object 注意: 定义set时,可用{}来表示,但不能为空 如下: >>> type({}) # '{}'表示定义的是dict <class 'dict'> >>> type({1}) <class 'set'>
set方法
增
add(elem) 添加一个元素至set update(*others) 将可迭代对象添加至set
删
remove(elem) 删除set中指定的元素,如果找不到抛出KeyError discard(elem) 删除set中指定的元素,如果找不到,就什么都不做 pop() --> elem 随机弹出set中某元素,并输出至标准输出 如果找不到抛出KeyError clear() 清空set内所有元素 问: 为什么抛出的异常是KeyError,而不是ValueError? 说明set是通过Key来查询值是否存在,而不是通过value的对比.
查
非线性结构,无法索引
改
修改,还不如直接删除,再增一个新元素
set成员运算符比较
比较set和list查询效率: lst1 = list(range(100)) lst2 = list(range(1000000)) -1 in lst1、-1 in lst2 # 使用此语句测试效率 s1 = set(range(100)) s2 = set(range(1000000)) -1 in s1、-1 in s2 # 使用此语句测试效率 测试结果: list相差数量级的倍数 set相差无几
set和线性结构
线性结构在查询效率方面,查询的数据的量级越大,所消耗的时间则会越多. set、dict等,内部使用hash作为key,在查询上时间复杂度为O(1).即查询时间,跟数据量级无关.
可hash对象
整型
字符型
tuple
None
bytes(保存的是对应的字符编码)
使用内置的hash()函数来判断此对象是否是可hash的.
例:
>>> hash([1]) # 列表不可hash
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'