zoukankan      html  css  js  c++  java
  • [PY3]——内置数据结构(6)——集合及其常用操作

    集合及其常用操作Xmind图

            

    集合的定义

    # set( )
    # {0,1,2}          //注意不能用空的大括号来定义集合
    # set(可迭代对象)
    
    In [1]: s=set();type(s)
    Out[1]: set
    
    In [2]: s={0,1,2};type(s)
    Out[2]: set
    
    In [3]: s=set(range(5));type(s)
    Out[3]: set

    增加操作

    1. add()

    In [8]: s={0,1,2}
    #在集合后添加单个元素
    In [9]: s.add(3);s
    Out[9]: {0, 1, 2, 3}
    
    #增加已存在的元素时,集合不变
    In [10]: s.add(3);s
    Out[10]: {0, 1, 2, 3}

    2. update()

    In [12]: s={0,1,2}
    #增加一个可迭代对象
    In [13]: s.update(range(4,7));s
    Out[13]: {0, 1, 2, 4, 5, 6}
    
    In [14]: s.update(range(4,9));s
    Out[14]: {0, 1, 2, 4, 5, 6, 7, 8}

    删除操作

    1. remove() 删除给定元素,元素不存在抛出KeyError

    In [16]: s={0,1,2}
    
    In [17]: s.remove(0);s
    Out[17]: {1, 2}
    
    In [18]: s.remove(10);s
    KeyError: 10

    2. discard() 删除给定元素,元素不存在什么都不做

    In [27]: s=set(range(10));s
    Out[27]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    In [29]: s.discard(4);s
    Out[29]: {0, 1, 2, 3, 5, 6, 7, 8, 9}
    
    In [30]: s.discard(10);s
    Out[30]: {0, 1, 2, 3, 5, 6, 7, 8, 9}

    3. pop() 随机删除一个元素并返回该元素

    In [19]: s={0,1,2}
    
    In [21]: s.pop()
    Out[21]: 0
    
    In [22]: s.pop()
    Out[22]: 1
    
    In [24]: s.pop()
    Out[24]: 2
    
    In [25]: s
    Out[25]: set()
    
    In [26]: s.pop()    //当集合为空时。报错KeyError
    KeyError: 'pop from an empty set'

    4. clear() 清空集合

    In [31]: s=set(range(10));s
    Out[31]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    In [32]: s.clear();s
    Out[32]: set()

    修改操作

    集合不能修改单个元素

    查找操作

    集合不是一个线性结构,所以集合不能通过索引查找、集合也没有顺序、集合也没有访问单个元素的方法

    集合运算

    1. 交集运算

    # intersection()求交集
    In [1]: s1={1,2,3};s2={2,3,6}
    
    In [2]: s1.intersection(s2)
    Out[2]: {2, 3}
    
    # intersection_update() 求交集并修改了s1
    In [5]: s1.intersection_update(s2)
    
    In [6]: print(s1,s2)
    {2, 3} {2, 3, 6}
    
    # set重载了‘&’作为求交集的运算符
    In [9]: s1 & s2
    Out[9]: {2, 3}

    2. 差集运算

    # difference() 
    In [10]: s1={1,2,3};s2={2,3,6}
    
    In [11]: s1.difference(s2)
    Out[11]: {1}
    
    In [12]: s2.difference(s1)
    Out[12]: {6}
    
    In [13]: print(s1,s2)
    {1, 2, 3} {2, 3, 6}
    
    # difference_update()
    In [14]: s1.difference_update(s2)
    
    In [15]: print(s1,s2)
    {1} {2, 3, 6}
    
    # set重载了‘-’作为求差集的运算符
    In [17]: s1-s2
    Out[17]: {1}
    
    In [18]: s2-s1
    Out[18]: {6}

    3. 对称差集=交集的补集

    # symmetric_difference()求对称差集
    In [19]: s1={1,2,3};s2={2,3,6}
    
    In [20]: s1.symmetric_difference(s2)
    Out[20]: {1, 6}
    
    # symmetric_difference_update()同理
    
    # set重载了‘^’作为求对称差集的运算符
    In [26]: s1^s2
    Out[26]: {1, 6}

    4. 并集运算

    # union()求并集
    In [27]: s1={1,2,3};s2={2,3,6}
    
    In [28]: s1.union(s2)
    Out[28]: {1, 2, 3, 6}
    
    # update()就是并集的uptdate版本
    In [29]: s1.update(s2)
    
    In [30]: print(s1,s2)
    {1, 2, 3, 6} {2, 3, 6}
    
    # set重载了‘|’作为求并集的运算符
    In [2]: s1|s2
    Out[2]: {1, 2, 3, 6}

    集合相关的判断

    # A.issubset(B) 判断A是否是B的子集
    In [1]: s1={1,2,3,4};s2={2,3}
    
    In [2]: s2.issubset(s1)
    Out[2]: True
    
    In [3]: s1.issubset(s2)
    Out[3]: False
    
    # A.issuperset(B) 判断A是否是B的超集
    In [4]: s1.issuperset(s2)
    Out[4]: True
    
    In [5]: s2.issuperset(s1)
    Out[5]: False
    
    # isdisjoint()判断是否有交集,有交集返回False、无交集返回True
    In [6]: s1={1,2,3,4};s2={2,3};s1.isdisjoint(s2)
    Out[6]: False
    
    In [8]: s3={1,2};s4={6,3};s3.isdisjoint(s4)
    Out[8]: True

    集合的应用

    1.去重
    2.成员运算符时的效率提高(参见博文《[PY3]——基本语法中成员运算符的内容》
    3.场景一:有一个api它要有认证并且有一定权限才可以访问,例如要求满足权限A/B/C任意一项,有一个用户具有权限B、C、D,判断该用户是否有权限访问此API
    4.场景二:有一个任务列表存储全部的任务,有一个列表存储已完成的任务,找出未完成的任务

    集合的限制

    总结来说:集合的元素必须是可Hash的(tuple、str、bytes等)

    # list不可作为集合元素
    In [10]: {[1,1,2],[6,6,8]}
    TypeError: unhashable type: 'list'
    
    # bytearray不可作为集合元素
    In [11]: {bytearray(b'abc')}
    TypeError: unhashable type: 'bytearray'
    
    # set不可作为集合元素
    In [12]: {{6,6,8}}
    TypeError: unhashable type: 'set'
    
    # tuple可作为集合元素
    In [13]: {(3,1,3)}
    Out[13]: {(3, 1, 3)}
    
    # bytes可作为集合元素
    In [14]: {b'abc'}
    Out[14]: {b'abc'}
    
    # str可以作为集合元素
    In [15]: {'b','a'}
    Out[15]: {'a', 'b'}
  • 相关阅读:
    oracle 函数
    Oracle 语句
    递归算法算出某个目录下所有目录和文件
    static
    递归算法
    JVM/JDK/JRE
    java跨平台原理
    .NET 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”
    JS 判断对象是否为空
    html网页打印A4样式
  • 原文地址:https://www.cnblogs.com/snsdzjlz320/p/6650899.html
Copyright © 2011-2022 走看看