下面是使用字典來尋找在文檔中出現(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版)》