zoukankan      html  css  js  c++  java
  • 第九篇 Python数据类型之集合

    集合 set

    写在最前,必须要会的:
    1、长度len
    2、成员运算in和not in
    3、|合集
    4、&交集
    5、-差集
    6、^对称差集
    7、==
    8、父集:>,>=
    9、子集:<,<=

    
    

    作用:去重,关系运算

    可变类型与不可变类型的区别:
    可变类型是不可hash类型
    不可变类型是可hash类型: 字符串,数字,元组

    定义集合:
    集合:用花括号{}表示,可以包含多个元素,用逗号分割
    集合的元素遵循三个原则:
    1:每个元素必须是不可变类型(可hash,可作为字典的key),不可变类型只有数字,字符串,元组,所以集合的元素也只能是这三种
    2: 没有重复的元素
    3:无序排列
    注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值

    s3={1,2,3,4,5,6}
    print(s3)
    
    #结果
    {1, 2, 3, 4, 5, 6}
    
    #将字符串转换为集合
    s1=set('hello')
    print(s1)
    
    #结果
    {'o', 'h', 'e', 'l'}    # 这可以体现出集合是无序的
    
    #将列表转换为集合,如果有重复元素,会自动去重
    s2=set(['alex','alex','sb'])
    print(s2)
    
    #结果
    {'alex', 'sb'}

    # 在集合里定义元组
    s={1,2,3,4,5,6,("adfa",1232)}
    print(s)

    #结果
    {'s', 1, 2, 3, 4, 5, 6, '3', ('adfa', 1232)}

    集合的内置函数

    add():往集合里添加元素,每次只能添加一个,而update可以一次更新多个值

    s.add('s')
    s.add('3')
    s.add(3)
    print(s)
    
    #结果
    {1, 2, 3, 4, 5, 6, 's', '3'}

    clear():清空集合

    s={1,2,3,4,5,6,("adfa",1232)}
    s.clear()
    print(s)
    
    #结果
    set()

     pop():随机删除集合的元素

    s={'sb',1,2,3,4,5,6}
    #随机删
    s.pop()
    print(s)
    
    #结果
    {2, 3, 4, 5, 6, 'sb'}

    remove():从集合里删除指定元素,如果要删除的元素不存在,程序会直接报错

    s={'sb',1,2,3,4,5,6}
    
    s.remove('sb')
    s.remove('hellol') #删除元素不存在会报错
    print(s)

    discard():从集合里删除指定元素,如果要删除的元素不存在,程序不会报错

    s={'sb',1,2,3,4,5,6}
    
    
    #指定删除
    s.discard('sb')
    s.discard('sbbbb')#删除元素不存在不会报错
    print(s)

    集合关系运算:交、差、并集

    有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
      pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
      linuxs={'wupeiqi','oldboy','gangdan'}

    (1)intersection(self, *args, **kwargs):求交集   
    符号表示法: A & B

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    
    # 求出即报名python又报名linux课程的学员名字集合
    # for循环方法
    py_and_linux = []
    for item in pythons:
        if item in linuxs:
            py_and_linux.append(item)
    print(py_and_linux)
    
    # 用集合的方法---交集
    s = pythons.intersection(linuxs)
    print(s)
    print(pythons & linuxs)
    
    #结果
    ['wupeiqi', 'gangdan']
    {'wupeiqi', 'gangdan'}
    {'wupeiqi', 'gangdan'}
    
    

    (1-1) intersection_update(self, *args, **kwargs):

    ( 2 ) union():求并集

          符号表示法: A | B

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    
    # 求出所有报名的学生名字集合
    print(pythons.union(linuxs))
    print(pythons|linuxs)
    
    #结果
    {'wupeiqi', 'biubiu', 'gangdan', 'alex', 'oldboy', 'yuanhao', 'egon'}
    {'wupeiqi', 'biubiu', 'gangdan', 'alex', 'oldboy', 'yuanhao', 'egon'}

    (2-2)

    (3)difference(self, *args, **kwargs):求差集  A - B ,就是要从A里去掉既再在A里又在B里的人=A里剩下的人(只在A里有,不在B里的人)

    符号表示法: A - B

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    
    #  求出只报名python课程的学员名字
    print('差集',pythons - linuxs)
    print(pythons.difference(linuxs))
    
    # 结果
    差集 {'alex', 'egon', 'yuanhao', 'biubiu'}
    {'alex', 'egon', 'yuanhao', 'biubiu'}
    
    # 求出只报名linux课程的学员名字
    print('差集',linuxs-pythons)
    print(linuxs.difference(pythons))
    
    # 结果
    差集 {'oldboy'}
    {'oldboy'}

    (3-3) difference_update(self, *args, **kwargs): A-B先求差集得到结果,然后又把这个得到的结果赋值给A,即 A = A -B

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    
    pythons.difference_update(linuxs)
    print(pythons)
    
    # 相当于
    pythons = pythons - linuxs
    print(pythons)
    # 结果 {'egon', 'biubiu', 'alex', 'yuanhao'} Pythons 原来是{'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'},求差集后把pythons的值更新为{'egon', 'biubiu', 'alex', 'yuanhao'}了

    (4)  symmetric_difference(self, other)  :交差补集, 先把两个集合合并到一起,然后去掉两个集合都有的公有的部分

    符号表示法: A ^ B

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    #交叉补集
    print('交叉补集',pythons.symmetric_difference(linuxs))
    print('交叉补集',pythons^linuxs)
    
    #结果
    交叉补集 {'biubiu', 'egon', 'yuanhao', 'alex', 'oldboy'}
    交叉补集 {'biubiu', 'egon', 'yuanhao', 'alex', 'oldboy'}

    isdisjoint(self, *args, **kwargs) : 判断两个集合是否存在共有部分,如果存在返回FALSE,不存在返回TRUE

    s1={1,2}
    s2={2,3,5}
    s3 = {4,6,7}
    print(s1.isdisjoint(s2))
    print(s1.isdisjoint(s3))
    
    # 结果
    False
    True

    issubset(self, *args, **kwargs):判断A集合是否是B集合的子集 ,是,返回True, 不是,返回 Flase

    符号表示: A <= B

    s1={1,2}
    s2={1,2,3}
    print(s1.issubset(s2))#s1 是s2 的子集  True
    print(s1 <= s2)   # True
    print(s2.issubset(s1))#s2 是s1 的子集 False
    print(s2 <= s1)  # False

    issuperset(self, *args, **kwargs): 判断A是不是B的父集,是返回True, 不是 范湖 FALSE

    符号表示: A >=B

    s1={1,2}
    s2={1,2,3}
    
    print(s2.issuperset(s1))#s1 是s2 的父集  True
    print(s2 >= s1 )      # True
    
    print(s1.issuperset(s2))#s1 是s2 的父集  False
    print(s1 >= s2)       # False

    update(self, *args, **kwargs) : A.update(B)  将B的值更新到A

    s1={1,2}
    s2={1,2,3}
    s1.update(s2) #更新多个值
    s1.update([3,4],(5,6))  # 可以更新列表,元组的值到集合里
    print(s1)
    
    #结果
    {1, 2, 3, 4, 5, 6}

    集合本来是可变类型的,但是集合还有一种定义方式,通过  frozenset() 定义不可变类型的集合

    通过frozenset()方法定义的不可变集合,连add()和update()方法都没有的。

    s=frozenset('hello')
    print(s)
    
    # 结果
    frozenset({'o', 'h', 'l', 'e'})

    通过集合对列表进行简单的去重,不考虑列表的顺序是否改变

    names=['alex','alex','wupeiqi']
    
    names=list(set(names))
    print(names)
    
    # 结果
    ['wupeiqi', 'alex']
    
    
  • 相关阅读:
    深入理解Java中的final关键字
    【事故处理】开车撞了人,一定要这样处理,否则后悔终生!
    spark、storm与Hadoop
    深入理解Java中的final关键字
    java并发之原子性、可见性、有序性
    java中重写equals和hashCode方法
    RESTClient插件POST方法传递参数
    Java内部类的作用
    java常用设计模式
    思辨: 讨论交流和独立思考谁更重要。
  • 原文地址:https://www.cnblogs.com/victorm/p/9103333.html
Copyright © 2011-2022 走看看