下面是使用字典来寻找在文档中出现但不属于一个单词列表的单词。函数接收一个字典参数 d1,其中包含文档中所有的单词作为键;以及另一个参数 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 还提供了另一个内置类型,称为集合(set),它表现得和没有值而只使用键集合的字典类似。向一个集合添加元素很快,检查集合成员也很快。集合还提供方法和操作符来进行常见的集合操作。
例如,集合减法可以使用方法 difference 或者操作符 ‘-’ 来实现。因此我们可以将 substract 函数重写为:
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)
结果是一个集合而不是字典,但是对于遍历之类的操作,表现是一样的。
实例二:
def has_duplicates(t):
d = {}
for x in t:
if x in d:
return True
d[x] = True
return False
一个元素第一次出现的时候,把它加入到字典中。如果相同的元素再次出现时,函数就返回 True。
使用集合,我们可以这样写同一个函数:
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)
一个元素在一个集合中只能出现一次,所以如果 t 中间的某个元素是重复的,那么变成集合之后其长度会比 t 小。如果没有重复的元素,那么集合的长度应当和 t 相同。
实例三:
def uses_only(word, available):
for letter in word:
if letter not in available:
return False
return True
uses_only 检查 word 中所有的字符是不是在 available 中出现,我们可以这样重写:
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 函数的目标。
本文参考自《像计算机科学家一样思考Python (第2版)》
网友评论