zoukankan      html  css  js  c++  java
  • python-集合(set)知识整理


    ####   集合     ####

    • set 集合 和 线性结构

    • 线性结构  的查询时间复杂度是  O(n),即随着数据规模的增大而增加耗时。
    • set集合 ,dict 字典  等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关
    • 可hash
      • 数字型:int、float、complex
      • 布尔型:True、False
      • 字符串:string、bytes
      • 元组:tuple
      • None
      • 以上都是不可变类型,成为可哈希 类型
    set  的元素必须是可hash的。***  不管你嵌套多少层,只要有不可哈希的元素就会报错 !!!


    集合特性: 1、元素必须是不可变类型(数字,字符串,元组),必须可ha
       2、不同元素组成,如果相同就会自动去重,只保留一个。
          3、集合是无序的
          4、集合是可变类型

    定义集合:s = {1,4,32,1}

     使用s = set()时,必须是可迭代对象才行。

    
    


    # 集合是一个可变的、无序的,不重复的数据组合,
    它的主要作用如下:
      1、去重,把一个列表变成集合,就自动去重了
      2、关系测试,测试两组数据之前的交集、差集、并集等关系
    (注:set元素要求必须可hash才能加入到set元素中)
    因为没有顺序,所以无法被索引,但是可以被迭代。
    list01 = [1,4,5,6,7,8,4,5,6]
    print(list01,type(list01))
    # [1, 4, 5, 6, 7, 8, 4, 5, 6] <class 'list'>
    list01 = set(list01)
    print(list01,type(list01))
    # {1, 4, 5, 6, 7, 8} <class 'set'>

    基本概念:
      全集
        所有元素的集合,
      子集subset和超集superset
        一个集合A所有元素都在另一个集合B内,A是B的子集,B是A的超集
      真子集和真超集
        A是B的子集,且A不等于B,A就是B的真子集,B是A的真超集。
      并集:过个集合合并的结果
      交集:多个集合的公共部分
      差集:集合中除去和其他集合公共部分



    # ################### 交集 (intersection)符号为:【 & 】 #########################

     

    # 交集 表示符号:& 表示 集合1和集合2 中都有的。
    list02 = set([2,6,0,22,8,4])
    print(list01,list02)
    # {1, 4, 5, 6, 7, 8} {0, 2, 4, 6, 8, 22}
    # # 交集 intersection
    print(list01.intersection(list02))

    # ################### 并集 (union)符号为: 【 | 】#########################

    
    
    # 并集 表示符号:| 表示 集合1或者是集合2中有的
    # # 并集 union 并起来去重
    print(list01.union(list02))
    # {0, 1, 2, 4, 5, 6, 7, 8, 22}



    # ################### 差集 (difference)符号为:【 - 】 #########################

    A -P = {} ,A -P 为空集,说明P包含A

     

     


    # 差集表示符号:- 表示 set01 - set02 表示 set01中有的,set02中没有的
    # set02 - set01 表示 set02中有的,set01中没有的
    #  # 差集  difference list01中有的,list02中没有的
    print(list01.difference(list02))
    # {1, 5, 7}
    print(list02.difference(list01))
    # {0, 2, 22}


    # ################### 子集 (issubset) #########################
    aa.issubset(bb) 进行判断,aa是不是bb的子集

    # ################### 父集 (issuperset #########################



    # ################### 反向差集| 交叉补集| 对称差集 (symmetric_difference)符号为:【 ^ 】 #########################



    # list01和list02里面,互相都没有的,取出来放到一块
    print(list01.symmetric_difference(list02))

    ########################## 集合的功能介绍及举例说明 ###################################
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # __author__:anxu.qi
    # Date:2018/12/4
    #######################################################################################
    a = {11, 22, 33, 44, 66, 99, "oopp",1123, "111"}
    b = {11,22,88,99,"oopp","opop"}

    # ##################### add 向集合中添加元素 注:一次只允许添加一个元素 ####

    # a.add("vivo")
    # print(a) # {33, 66, 'opop', 'vivo', 11, 44, 77, 22, 55}

    # #################### clear 删除集合的所有的元素 #################

     

    # #################### copy 浅copy ####
    重新赋值一份数据给s1


    # #################### difference A中存在的B中不存在的 ####
    # A中存在,B中不存在 返回一个新值,变量接受
    c = a.difference(b)
    print(c) # {33, 66, 1123, 44, '111'}
    # #################### difference_update A中存在的B中不存在的,结果更新为A ####
    a.difference_update(b)
    print(a) # {33, 66, 1123, '111', 44}

    a = {11, 22, 33, 44, 66, 99, "oopp",1123, "111"}
    b = {11,22,88,99,"oopp","opop"}
    # #################### discard 移除指定的元素,不存在不报错 ####

     


    # #################### remove 移除指定的元素,不存在则提示ERROR。 ####

    做的是key的比较

    a.discard(11111)
    # #################### intersection 取出交集并赋值给cc #####
    cc = a.intersection(b)
    print(cc) # {11, 'oopp', 99, 22}
    # #################### intersection_update 取出交集并赋值给A ####
    a.intersection_update(b)
    print(a) # {'oopp', 11, 99, 22}
    # #################### isdisjoint 如果没有交集返回True,有交集为False ####
    print(a.isdisjoint(b)) # False
    se = {11,22,33,44}
    be = {11,22}
    # #################### issubset # 另一个集合是否包含此集合, 子序列 ####
    print(be.issubset(se)) # True
    # #################### issuperset # 这个集合是否包含另一个集合 父序列 ####
    print(se.issuperset(be)) # True



    # #################### pop # 移除并返回任意集合元素,如果集合为空,则引发KeyError ####

    aaa = se.pop()  # 可以将移除的那个元素赋值给其他值 ####
    print(aaa) # 33
    # #################### symmetric_difference # 将se中存在的be不存在的,be不存在的se中存在的合并到了一起,赋值为dddd ####
    dddd = se.symmetric_difference(be)
    print(dddd) # {33, 99, 44, 77, 88}
    cccc = se.symmetric_difference(be)
    print(cccc) # {33, 99, 44, 77, 88}
    # #################### symmetric_difference_update # 将se中存在的be不存在的,be不存在的se中存在的合并到了一起,赋值为se ####
    se.symmetric_difference_update(be)
    print(se) # {33, 99, 44, 77, 88}
    # ##############################
    se = {11,22,33,44,99}
    be = {11,22,77,88}
    # #################### union # 取并集 ####

     


    tt = se.union(be)
    print(tt) # {33, 99, 11, 44, 77, 22, 88}
    # #################### update # 更新的时候,必须得是可迭代(Iterable) ####
    |= 就等于update

     

     

    se.update([666,888])
    se.update(666,888)
    print(se)
    # ########################################################################################################

    list 随着规模的增加,效率在往下走,

    set 随着规模的增加,效率还是那样



     集合补充:

    不可变集合:frozonset

     # 不考虑顺序的快速去重

    #####有一篇介绍python集合的文章,写的很好
    https://tw.saowen.com/a/ab713431b675abe3d71cf675d04082b9601135ba484291bb2b3a95b6ccad0e4f
    我的目标是每天厉害一点点
  • 相关阅读:
    Android核心分析之十七电话系统之rilD
    Android核心分析之十六Android电话系统-概述篇
    Android核心分析之十五Android输入系统之输入路径详解
    Android核心分析之十四Android GWES之输入系统
    Android 核心分析之十三Android GWES之Android窗口管理
    Android 核心分析之十二Android GEWS窗口管理之基本架构原理
    Android核心分析 之十一Android GWES之消息系统
    Android核心分析 之十Android GWES之基本原理篇
    Android核心分析 之九Zygote Service
    Android 核心分析 之八Android 启动过程详解
  • 原文地址:https://www.cnblogs.com/sidaofeng/p/10045636.html
Copyright © 2011-2022 走看看