14. 集合 Set

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的文檔。

相關文章
相關標籤/搜索