Set(集合)是一种常见的、包含不重复元素的数据结构,经常用来判断元素是否存在集合里面或用来判断是否重复。
1. 集合操作
Set比Dict有更丰富的操作,集合中最常用的操作就是去重、判断是否存在一个元素等。
假设有A、B两个集合,可以有以下操作:
交集:A & B
并集:A | B
差集:A - B
对称差:A ^ B 即:(A|B) - (A&B)
2.frozenset
这也是一种集合,他的内容是无法变动的,一般常见用法是用一个可迭代的对象初始化他,然后只用来判重等操作;
如果一开始元素数量固定,一般就会用forzenset,但如果是可变的对象,并且不断添加元素的话,会使用python内置的set。
3.实现set的抽象数据结构
"""实现之前还是引用之前哈希表那里的HashTable类"""
#-*- coding:utf-8 -*-
class SetADT(HashTable):
"""
继承HashTable类
"""
def add(self, key):
"""
调用父类的add的方法,
简单的把value的值设置成True就可以
表示有这个元素存在,
因为hash表是(key,value)的结构,
所以value设为True就可以。
"""
return super(SetADT, self).add(key, True)
def __and__(self, other_set): #交集
new_set = SetADT() #定义一个新的集合
for element_a in self: #遍历当前集合的元素,元素为element_a
if element_a in other_set: #如果element_a也是在另外一个集合里面
new_set.add(element_a) #将element_a添加到新集合里面
return new_set #最后返回这个新集合
def __sub__(self, other_set): #差集
new_set = SetADT()
for element_a in self:
if element_a not in other_set:
new_set.add(element_a)
return new_set
def __or__(self, other_set): #并集
"""
因为之前引用了Hash表的类,
所以有重复的元素出现时,
Hash表会保证不会重复添加的,
因为相同的重复元素都是同样的key值。
"""
new_set = SetADT()
for element_a in self:
new_set.add(element_a)
for element_b in other_set:
new_set.add(element_b)
return new_set
#单元测试
def test_set_adt():
sa = SetADT()
sa.add(1)
sa.add(2)
sa.add(3)
assert 1 in sa
sb = SetADT()
sb.add(3)
sb.add(4)
sb.add(5)
assert sorted(list(sa & sb)) == [3]
assert sorted(list(sa | sb)) == [1,2,3,4,5]
assert sorted(list(sa - sb)) == [1,2]
___________________分割线________________________________
(未完成部分)
a . 集合判断一个元素是否存在的时间复杂度是O(1)
参考资料:https://blog.youkuaiyun.com/baoli1008/article/details/48059623
b . 在SetADT基础上实现remove和pop操作。
pass
c. 实现对称差(A ^ B)的操作。
pass
d. 用文档查询工具查看python关于set的文档。
转载于:https://blog.51cto.com/286577399/2345782