Python 成长笔记

Python拾珍:5. 集合

2018-02-27  本文已影响6人  赵者也

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

上一篇 下一篇

猜你喜欢

热点阅读