定义与初始化
- 数学意义上的集合
- 没有重复元素
例子:
>>> s = set()
>>> s
set()
>>> s = {1, 2, 3}
>>> s
{1, 2, 3}
>>> s = set(range(3))
>>> s
{0, 1, 2}
#set()是可以对可迭代对象进行转化的
增加
>>> s
{0, 1, 2}
>>> s.add(3)
>>> s
{0, 1, 2, 3}
>>> s.add(3)
>>> s
{0, 1, 2, 3}
这里可以发现,在增加已存在的元素时,set集合并不会继续追加新的元素。没有重复的元素。
>>> help(s.update)
Help on built-in function update:
update(...) method of builtins.set instance
Update a set with the union of itself and others.
#用自身和他人的联合更新一个集合。
update()这个方法,就是把自己和别人union起来,但是会去重。
>>> s
{0, 1, 2, 3}
>>> s.update(range(4,7))
>>> s
{0, 1, 2, 3, 4, 5, 6}
这个方法和列表类似,附加一个可迭代对象,没有返回值,原地修改。
>>> s
{0, 1, 2, 3, 4, 5, 6}
>>> s.update(range(5,8))
>>> s
{0, 1, 2, 3, 4, 5, 6, 7}
有上述表达式可发现,set集合对于已经存在的元素,什么也不做。
删除
- set.remove
>>> help(s.remove)
Help on built-in function remove:
remove(...) method of builtins.set instance
Remove an element from a set; it must be a member.
If the element is not a member, raise a KeyError.
看remove函数的签名:
- 会从集合中删除你传入的变量,但是这个变量必须是集合中已有的元素。
- 如果这个元素不存在,是会抛出异常的。
>>> s
{0, 1, 2, 3, 4, 5, 6, 7, 8}
>>> s.remove(0)
>>> s
{1, 2, 3, 4, 5, 6, 7, 8}
>>> s.remove(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 0
在上面删除时可发现:原地修改,不返回值。
- set.pop
pop方法用来弹出一个元素
>>> help(s.pop)
Help on built-in function pop:
pop(...) method of builtins.set instance
Remove and return an arbitrary set element.
Raises KeyError if the set is empty.
函数签名中可以看出,pop和remove有一个区别,pop会return这个被删除的值。同时,如果集合为空,还进行pop的话,会抛出KeyError异常。
>>> s.pop()
1
>>> s.pop()
2
>>> s.clear()
>>> s.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'
这里用pop分别删除了2个元素,但是没有办法指定删除哪个。
- set.discard
>>> help(s.discard)
Help on built-in function discard:
discard(...) method of builtins.set instance
Remove an element from a set if it is a member.
If the element is not a member, do nothing.
discard和pop的区别:discard可以选择想要删除的元素值,而不是像pop那样,只能从队首或者队尾删除。
有点类似于list中的remove方法:
>>> s = {'kidult', '让你的生活', '变得', '更自信'}
>>> s
{'更自信', 'kidult', '变得', '让你的生活'}
>>> s.discard('kidult')
>>> s
{'更自信', '变得', '让你的生活'}
discard可以指定删除哪个元素,且还有一点于pop不同:discard是原地修改,不返回值。
>>> s.discard('smart')
>>> s
{'更自信', '变得', '让你的生活'}
当删除不存在的值时,也不会报错。
- 小结
- remove:删除给定的元素,元素不存在抛出KeyError
- discard:删除给定的元素1,元素不存在也可以继续运行
- pop:随机删除一个元素并返回,集合为空是,抛出KeyError
- clear:清空集合
修改
集合不能修改单个元素
查找
集合不能通过索引访问,因为集合不是一个线性结构。
集合没有访问单个元素的方法
集合不是线性结构,集合元素没有顺序
成员运算符
在集合中,很多时候都会涉及到成员包含计算:
- in
- not in
用成员运算符来判断一个元素是否在容器中
set、list、tuple、str、int都是的
>>> 3 in [1, 2, 3, 4]
True
>>> 10 in {1, 2, 3, 4}
False
>>> 10 not in (1, 2, 3, 4)
True
>>> 'kidult' not in 'kidult smart'
False
无论是数字、字符串都是用来判断的
成员运算符返回布尔值,所以经常用在if判断句中
在集合这里提到成员运算符是因为:
在集合中是没有顺序的,所以集合的成员运算符和其他线性结构的时间复杂度不同。
在做成员运算时,列表的效率和列表的规模有关,集合的效率和集合的规模无关。
- 集合的效率:O(1)
- 列表的效率:O(n)
所以可能的话,做成员运算的时候,会把列表、元组转化成集合来做。
小结
还有一部分集合的数据结构放在字典的部分。虽然有点不太好理解,也在承受范围内,今天偷懒了,明天要加油啊!