• 数据类型之集合


    在python中集合分两种:

    • set: 可变集合
    • fronzenset: 不可变集合

    集合的特点:

    • 无序,非线性结构,不可以索引
    • 不重复,常用于去重
    • 可迭代
    • 元素必须是可hash的,即不可变类型,包括嵌套数据结构中的元素
    • 通过hash table实现,查询速度极快,可以高效地判断元素是否存在于某个集合
    • 集合很消耗内存

    线性结构的查询时间复杂度是O(n),即随着数据规模的增大而耗时增加。set和dict通过hash table实现,时间复杂度是O(1),查询时间与数据规模无关。

    创建一个set。注意:创建一个空集合必须使用set()而不是{},{}用来创建一个空字典

    s1 = set('abcde')
    s2 = set(['a','b','c','d','e'])
    s3 = {'a','b', 'c', 'd', 'e'}
    print(s1)
    print(s2)
    print(s3)
    # {'c', 'a', 'e', 'd', 'b'}
    # {'c', 'a', 'e', 'd', 'b'}
    # {'c', 'a', 'e', 'd', 'b'}
    

    创建一个frozenset

    s4 = frozenset('abcde')
    print(s4)
    # frozenset({'c', 'a', 'e', 'd', 'b'})
    

    集合运算

    s5 = set('cefxyz')
    
    # 并集(合集),相加
    print(s1 | s5)
    # 这里可以传递一个或多个iterable,返回一个新的集合
    print(s1.union(s5))
    # 'z', 'd', 'f', 'c', 'x', 'a', 'e', 'b', 'y'}
    
    # 并等
    s1 |= s5
    print(s1)
    # {'c', 'd', 'e', 'z', 'b', 'f', 'a', 'y', 'x'}
    # 这里也可以传递一个或者多个iterable,不同的是这里是就地修改
    s1.update('opq')
    print((s1))
    # {'o', 'a', 'm', 'd', 'c', 'b', 'e', 'q', 'p'}
    
    # 交集,公共部分
    print(s1 & s5)
    print(s1.intersection(s5))
    # {'c', 'e'}
    
    # 交等
    s1 &= s5
    print(s1)
    print(s1.intersection_update('opq'))
    # {'c', 'e'}
    
    # 差集,相减
    print(s1 - s5)
    print(s1.difference(s5))
    # {'b', 'a', 'd'}
    
    # 差等
    s1 -= s5
    print(s1)
    s1.difference_update(s5)
    # {'b', 'a', 'd'}
    
    # 对称差集,并集减去交集
    print(s1 ^ s5)
    print(s1.symmetric_difference(s5))
    # {'x', 'a', 'b', 'z', 'y', 'd', 'f'}
    
    # 对称差等
    s1 ^= s5
    print(s1)
    s1.symmetric_difference_update(s5)
    # {'x', 'a', 'b', 'z', 'y', 'd', 'f'}
    

    对于两个集合A和B,如果A是B的子集,且A不等于B,那么A就是B的真子集,B是A的真超集。

    判断一个集合是否是另一个集合的子集

    s6 = {'a', 'b', 'c', 'd', 'e', 'f', 'g'}
    print(s1.issubset(s6))
    # True
    print(s1 <= s6)
    # True
    
    # 判断真子集
    print(s1 < s6)
    # True
    

    判断一个集合是否是另一个集合的超集(父集)

    print(s6.issuperset(s1))
    # True
    print(s6 >= s1)
    # True
    
    # 判断真超集
    print(s6 > s1)
    # True
    

    判断两个集合是否没有交集

    print(s1.isdisjoint(s6))
    # False
    

    添加一个元素

    s1.add('m')
    print((s1))
    # {'a', 'c', 'e', 'b', 'm', 'd'}
    

    删除一个元素

    # 对于remove()方法,如果元素不存在将抛出KeyError异常
    s1.remove('a')
    print((s1))
    # {'p', 'e', 'c', 'd', 'm', 'o', 'q', 'b'}
    
    # discard()方法同样用来删除一个元素,不过元素不存在时不做任何操作,并且不会抛出异常
    s1.discard('b')
    print(s1)
    # {'q', 'd', 'o', 'e', 'p', 'c', 'm'}
    
    # pop()删除任意一个元素并返回它的值,如果集合为空将抛出KeyError异常
    res = s1.pop()
    print(res)
    # d
    

    参考:
    https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
    http://www.runoob.com/python3/python3-set.html
    https://zh.wikipedia.org/wiki/集合_(数学)

  • 相关阅读:
    SQLSERVER排查CPU占用高的情况
    bootstrap布局两列或者多列表单
    ASP.NET Redis 开发
    .NET 环境中使用RabbitMQ
    EasyNetQ介绍
    .Net使用RabbitMQ详解
    ASp.net中Froms验证方式
    全国-城市-百度地图中心点坐标
    IIS7.0下 HTTP 错误 404.15
    asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法
  • 原文地址:https://www.cnblogs.com/keithtt/p/9465549.html
Copyright © 2020-2023  润新知