Python拾珍:5. 集合

下面是使用字典來尋找在文檔中出現(xiàn)但不屬于一個單詞列表的單詞。函數(shù)接收一個字典參數(shù) d1,其中包含文檔中所有的單詞作為鍵;以及另一個參數(shù) d2,包含單詞列表。它返回一個字典,包含 d1 中所有不在 d2 之中的鍵:

def substract(d1, d2):
    res = dict()
    for key in d1:
        if key not in d2:
            res[key] = None
    return res

在這些字典中,值都是 None,因為我們從來不用它們。因此,我們實際上浪費了一些存儲空間。

Python 還提供了另一個內(nèi)置類型,稱為集合(set),它表現(xiàn)得和沒有值而只使用鍵集合的字典類似。向一個集合添加元素很快,檢查集合成員也很快。集合還提供方法和操作符來進行常見的集合操作。

例如,集合減法可以使用方法 difference 或者操作符 ‘-’ 來實現(xiàn)。因此我們可以將 substract 函數(shù)重寫為:

def substract(d1, d2):
    # res = dict()
    # for key in d1:
    #     if key not in d2:
    #         res[key] = None
    # return res
    return set(d1) - set(d2)

結(jié)果是一個集合而不是字典,但是對于遍歷之類的操作,表現(xiàn)是一樣的。

實例二:

def has_duplicates(t):
    d = {}
    for x in t:
        if x in d:
            return True
        d[x] = True
    return False

一個元素第一次出現(xiàn)的時候,把它加入到字典中。如果相同的元素再次出現(xiàn)時,函數(shù)就返回 True。

使用集合,我們可以這樣寫同一個函數(shù):

def has_duplicates(t):
    # d = {}
    # for x in t:
    #     if x in d:
    #         return True
    #     d[x] = True
    # return False
    return len(set(t)) < len(t)

一個元素在一個集合中只能出現(xiàn)一次,所以如果 t 中間的某個元素是重復(fù)的,那么變成集合之后其長度會比 t 小。如果沒有重復(fù)的元素,那么集合的長度應(yīng)當和 t 相同。

實例三:

def uses_only(word, available):
    for letter in word:
        if letter not in available:
            return False
    return True

uses_only 檢查 word 中所有的字符是不是在 available 中出現(xiàn),我們可以這樣重寫:

def uses_only(word, available):
    # for letter in word:
    #     if letter not in available:
    #         return False
    # return True
    return set(word) <= set(available)

操作符 <= 檢查一個集合是否是另一個集合的子集,包括兩個集合相等的情況。這正好符合 uses_only 函數(shù)的目標。

本文參考自《像計算機科學(xué)家一樣思考Python (第2版)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,794評論 25 709
  • 夜以深,多少人卸下了偽裝一天的面具來展現(xiàn)出真實的自己,溫文爾雅之人露出自己放蕩不羈的個性,嘻哈愛笑之人露出自己安靜...
    Jachinzhao閱讀 566評論 0 0
  • 影子,你好,再見 ① 如果是前段時間,我大概也沒有現(xiàn)在這樣想要重頭再來的勇氣;也不會確定一個方向,然后一路狂奔;更...
    薛航帆閱讀 556評論 1 3
  • 今天中午,媽媽給我做了魚。魚非常好吃也非常的香,媽媽做的飯非常好吃,媽媽就像美食家一樣,我們吃飽了飯我?guī)蛬寢屗⑼霋?..
    靜如思閱讀 344評論 2 0
  • 人這一輩,好像很多人一直活在遺憾當中,后悔當初沒有做什么什么努力,才導(dǎo)致現(xiàn)在過著這樣糟糕的生活。不信你看: 近幾年...
    詩蒙閱讀 634評論 0 0

友情鏈接更多精彩內(nèi)容