14. 集合 Set

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.csdn.net/baoli1008/article/details/48059623

b . 在SetADT基礎上實現remove和pop操作。

    pass

c. 實現對稱差(A ^ B)的操作。

    pass

d. 用文檔查詢工具查看python關於set的文檔。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章