zoukankan      html  css  js  c++  java
  • 遇见Python集合类型

    Python目前有两种内置集合类型,set和frozenset。

    Ⅰ、两者区别

    set是可变的,没有哈希值,其内容可以使用add()remove()这样的方法来改变,所以不能被用作字典的键或其他集合的元素。
    frozenset是不可变的,并且为hashable,其内容在被创建后不能再改变,因此可以被用作字典的键或其他集合的元素。

    Ⅱ、创建集合

    两个类的构造器有着相同的作用方式:

    class set([iterable])
    class frozenset([iterable])
    

    返回一个新的set或frozenset对象,其元素来自于iterable。集合的元素必须为hashable。要表示由集合对象构成的集合,所有的内层集合必须为frozenset对象。如果未指定iterable,则将返回一个新的空集合。
    除了可以使用set构造器,非空的set(不是frozenset)还可以通过将以逗号分隔的元素列表包含于花括号之内来创建,例如:

    >>> a = {'hello', 'python'}
    >>> type(a)
    <class 'set'>
    

    当然如果想要建立一个空的集合,则必须用set构造器。

    Ⅲ、无序多项集set

    set对象是由具有唯一性的hashable对象所组成的无序多项集。常见的用途包括成员检测、从序列中去除重复项以及数学中的集合运算,例如交集、并集、差集与对称差集等等。
    与其他多项集一样,集合也支持x in set,len(set)for x in set作为一种无序的多项集,集合并不记录元素位置和插入顺序。相应地,集合不支持索引、切片或其他序列类的操作。

    Ⅳ、集合操作

    set和frozenset的实例提供一下操作:

    len(s) # 返回集合s中的元素数量
    x in s # 检测x是否为s中的成员
    x not in s # 检测x是否非s中的成员
    
    isdisjoint(other) # 如果集合中没有与other共有的元素则返回True
    
    issubset(other) # 等同于set <= other,检测集合是否为other子集
    set < other # 检测集合是否为other真子集
    issuperset(other) # 等同于set >= other,检测集合是否为other超集
    set > other # 检测集合是否为other真超集
    
    # 下面四种方法 返回一个新集合
    union(*others) # 等同于set | other | ...,并集
    intersection(*others) # 等同于set & other & ...,交集
    difference(*others) # 等同于set - other - ...,差集
    symmetric_difference(other) # 等同于set ^ other,补集
    
    copy() # 返回原集合的浅拷贝
    

    set的实例与frozenset的实例之间基于它们的成员进行比较。例如set('abc') == frozenset('abc')返回True,set('abc') in set([frozenset('abc')])也一样。

    可用于set而不能用于不可变的frozenset实例的操作:

    # 下面四种方法 更新集合
    update(*others) # 等同于set |= other | ...
    intersection_update(*others) # 等同于set &= other & ...
    difference_update(*others) # set -= other | ...
    symmetric_difference_update(other) # set ^= other
    
    add(elem) # 添加elem元素到集合中
    remove(elem) # 从集合中移除元素elem
    discard(elem) # 如果元素elem存在集合中则将其移除
    pop() # 从集合中移除并返回任意一个元素
    clear() # 移除集合中所有元素
    

    Note:issubset(), issuperset(), union(), intersection(), difference(), symmetric_difference(), update(), intersection_update(), difference_update()和symmetric_difference_update()方法会接受任意可迭代对象作为参数。

    set('abc') & 'cbs' # 错误
    set('abc').intersection('cbs') # 正确
    

    相比之下,它们所对应的运算符版本则要求其参数为集合。 这就排除了容易出错的构造形式例如 set('abc') & 'cbs',而推荐可读性更强的set('abc').intersection('cbs')

  • 相关阅读:
    再谈spark部署搭建和企业级项目接轨的入门经验(博主推荐)
    CSS基础3——使用CSS格式化元素内容的字体
    利用MySQL 的GROUP_CONCAT函数实现聚合乘法
    POJ Octal Fractions(JAVA水过)
    组件接口(API)设计指南-文件夹
    Nginx 因 Selinux 服务导致无法远程訪问
    host字段变复杂了
    hdu 1251 统计难题 初识map
    “那个人样子好怪。”“我也看到了,他好像一条狗。”
    pomelo 协议
  • 原文地址:https://www.cnblogs.com/malinqing/p/11249583.html
Copyright © 2011-2022 走看看