Set(集合)是一種常見的、包含不重複元素的數據結構,常常用來判斷元素是否存在集合裏面或用來判斷是否重複。python
1. 集合操做數據結構
Set比Dict有更豐富的操做,集合中最經常使用的操做就是去重、判斷是否存在一個元素等。ide
假設有A、B兩個集合,能夠有如下操做:
工具
交集:A & B
單元測試
並集:A | B
測試
差集:A - B
.net
對稱差:A ^ B 即:(A|B) - (A&B)
對象
2.frozensetblog
這也是一種集合,他的內容是沒法變更的,通常常見用法是用一個可迭代的對象初始化他,而後只用來判重等操做;繼承
若是一開始元素數量固定,通常就會用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.csdn.net/baoli1008/article/details/48059623
b . 在SetADT基礎上實現remove和pop操做。
pass
c. 實現對稱差(A ^ B)的操做。
pass
d. 用文檔查詢工具查看python關於set的文檔。