Python拾珍:5. 集合

下面是使用字典来寻找在文档中出现但不属于一个单词列表的单词。函数接收一个字典参数 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版)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,707评论 25 709
  • 夜以深,多少人卸下了伪装一天的面具来展现出真实的自己,温文尔雅之人露出自己放荡不羁的个性,嘻哈爱笑之人露出自己安静...
    Jachinzhao阅读 3,411评论 0 0
  • 影子,你好,再见 ① 如果是前段时间,我大概也没有现在这样想要重头再来的勇气;也不会确定一个方向,然后一路狂奔;更...
    薛航帆阅读 3,345评论 1 3
  • 今天中午,妈妈给我做了鱼。鱼非常好吃也非常的香,妈妈做的饭非常好吃,妈妈就像美食家一样,我们吃饱了饭我帮妈妈刷碗扫...
    静如思阅读 2,548评论 2 0
  • 人这一辈,好像很多人一直活在遗憾当中,后悔当初没有做什么什么努力,才导致现在过着这样糟糕的生活。不信你看: 近几年...
    诗蒙阅读 3,685评论 0 0