zoukankan      html  css  js  c++  java
  • python-集合

    一、集合

    定义:由不同元素组成的集合(set),是一个无序不重复元素的序列的可hash值,可以作为字典的key

     基本功能是进行成员关系测试和删除重复元素。

     可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

    实例:

    >>>x = set('runoob')
    >>> y = set('google')
    >>> x, y
    (set(['b', 'r', 'u', 'o', 'n']), set(['e', 'o', 'g', 'l']))   # 重复的被删除
    >>> x & y         # 交集
    set(['o'])
    >>> x | y         # 并集
    set(['b', 'e', 'g', 'l', 'o', 'n', 'r', 'u'])
    >>> x - y         # 差集
    set(['r', 'b', 'u', 'n'])
    >>>

     1、交集,二者的共同部分(求即报名python又报名linux的学生)

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    
    s=pythons & linuxs
    print(s)

     结果:

    {'gangdan', 'wupeiqi'}
    View Code

      intersection

      描述:交集运算,原集合不更新

      参数:set  要对比的集合

      返回值:得到一个交集  

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    
    print(pythons.intersection(linuxs))
    print(linuxs.intersection(pythons))
    print(pythons)#原集合不更新
    print(linuxs)#原集合不更新
    #输出结果
    {'wupeiqi', 'gangdan'}
    {'wupeiqi', 'gangdan'}
    {'alex', 'yuanhao', 'biubiu', 'gangdan', 'wupeiqi', 'egon'}
    {'oldboy', 'wupeiqi', 'gangdan'}

    2、并集:两集合所有不重复元素的集合

    # 并集:老男孩所有报名的学生名字集合
    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    
    
    s=pythons | linuxs
    print(s)

    结果:

    {'yuanhao', 'egon', 'biubiu', 'gangdan', 'wupeiqi', 'alex', 'oldboy'}
    View Code
      union:

      描述:并集运算,原集合不更新

      参数:set  要对比的集合

      返回值:得到一个新的集合,两个集合中都有的元素都合并成一个

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    print(pythons.union(linuxs))
    #输出结果同上
    {'oldboy', 'egon', 'alex', 'yuanhao', 'wupeiqi', 'gangdan', 'biubiu'}

    3、差集:查询所有不存在于B集合的A集合元素(求只报名python,没有报名linux的学生)

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    print(pythons - linuxs)

    结果:

    {'alex', 'egon', 'yuanhao', 'biubiu'}
    View Code

      difference 

    描述:差集运算,原集合不更新

    参数:set  要对比的集合

    返回值:得到一个差集

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    print(pythons - linuxs)
    print(pythons.difference(linuxs))#等同于pythons - linuxs
    
    print(linuxs - pythons)#只报名linux,未报名pythons
    print(linuxs.difference(pythons))
    #输出结果
    {'egon', 'yuanhao', 'biubiu', 'alex'}
    {'egon', 'yuanhao', 'biubiu', 'alex'}
    {'oldboy'}
    {'oldboy'}

    4.对称差集:与交集相反,排除重复元素的集合(没有同时报名python和linux课程的学生名字集合)

    pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
    linuxs={'wupeiqi','oldboy','gangdan'}
    print(pythons ^ linuxs)

    结果:

    {'alex', 'biubiu', 'egon', 'yuanhao', 'oldboy'}
    View Code

    symmetric_difference()

    描述:对称差集运算,原集合不更新

    参数:set  要对比的集合

    返回值:返回一个对称差集

    s1 = {'william','lisa','knight','pudding'}
    s2 = {'william','pudding','xxxxxx'}
    s3 = s1.symmetric_difference(s2)
    print(type(s3),s3)   # 得到一个对称差集
    print(type(s1),s1)   # 对称差集运算,原集合不更新
      输出结果:
    
    
    <class 'set'> {'knight', 'lisa', 'xxxxxx'}
    <class 'set'> {'knight', 'william', 'lisa', 'pudding'}

    5.父集、子集:>,>= ,<,<= 

    set1={1,2,3,4,5}
    set2={1,2,3,4}
    print(set1 >= set2)#set1是set2的父集,set1包含于set1
    print(set1 > set2)#

    结果:

    True
    True
    View Code

    issubset

    描述:判断原集合是否是要对比的集合的子集,如果是则返回True,否则返回False

    参数:set  要对比的集合

    返回值:得到一个布尔值

    issuperset

    描述:判断原集合是否是要对比的集合的父集,如果是则返回True,否则返回False

    参数:set  要对比的集合

    返回值:得到一个布尔值

    set1={1,2,3,4,5}
    set2={1,2,3,4}
    
    print(set1.issuperset(set2))#判断Set1是否是set2的父集
    print(set1.issubset(set2))#判断Set1是否是set2的子集

    6.update

    描述:扩展集合

    参数:要添加的集合

    返回值:None(原集合会被修改)

    s1={'apple','voivo','oppo','huwei'}
    s2={'hshshs'}
    s3=s1.update(s2) # 扩展集合s1
    print(type(s3),s3)# 查看返回值
    print(type(s1),s1)# 打印扩展后的集合s1
    输出结果
    <class 'NoneType'> None
    <class 'set'> {'knight', 'sky', 'pudding', 'lisa', 'william'}

    7、copy()

    描述:复制集合

    参数:无

    返回值:返回一个和原集合一样的新的集合

    s1 = {'william','lisa','knight','pudding'}
    s2 = s1.copy()  # 对集合s1进行复制
    print(type(s1),s1)
    print(type(s2),s2)
    #输出结果
    
    <class 'set'> {'knight', 'pudding', 'william', 'lisa'}
    <class 'set'> {'knight', 'pudding', 'william', 'lisa'}

    8、pop()

    描述:随机删除集合中的一个元素

    参数:无

    返回值:返回被删除的元素

    s1 = {'william','lisa','knight','pudding'}
    s2 = s1.pop()    # 随机删除集合中的一个元素不用指定参数,随机删除,并且会有返回值
     print(type(s1),s1) print(type(s2),s2) #输出结果 <class 'set'> {'lisa', 'knight', 'william'} <class 'str'> pudding

    9、clear()

    描述:清空字典

    参数:无

    返回值:None(原集合会被修改)

    s1 = {'william','lisa','knight','pudding'}
    s2 = s1.clear()  # 清空集合
    print(type(s1),s1)
    print(type(s2),s2)
    
    <class 'set'> set()
    <class 'NoneType'> None

    10、remove()

    描述:删除集合中指定的元素

    参数:element  元素

    返回值:None(原集合会被修改)

    s1 = {'william','lisa','knight','pudding'}
    s2 = s1.remove('lisa')#指定元素删除,元素不存在则报错,单纯的删除,没有返回值
    print(type(s1),s1)
     print(type(s2),s2) # 返回值为空 
    #输出结果 
    <class 'set'> {'william', 'pudding', 'knight'}
     <class 'NoneType'> None

    11、add()

    描述:为集合增加元素

    参数:element  元素

    返回值:None(原集合会被修改)

    linuxs={'wupeiqi','oldboy','gangdan'}
    linuxs.add('asb') #set类型的集合是可变类型
    linuxs.add([1,2,3]) #报错,只能添加不可变类型
    print(linuxs)
    #输出结果(两次)
    {'asb', 'oldboy', 'wupeiqi', 'gangdan'}
    
    linuxs.add([1,2,3]) #报错,只能添加不可变类型
    TypeError: unhashable type: 'list'

    12.difference_update

    述:差集运算,原集合更新

    参数:set  要对比的集合

    返回值:None(原集合会被修改)

    s1 = {'william','lisa','knight','pudding'}
    s2 = {'sky','william','hello','knight'}
    s3 = s1.difference_update(s2)
    print(type(s3),s3)  # 返回None
    print(type(s1),s1)  # 原集被更新
    #输出结果
    
    <class 'NoneType'> None
    <class 'set'> {'pudding', 'lisa'}

    13、discard()

    描述:删除集合中指定的元素,元素不存在不报错,单纯的删除

    参数:element  元素

    返回值:None(原集合会被修改)

    s1 = {'william','lisa','knight','pudding'}
    s2 = s1.discard('william')
    print(type(s2),s2)   
    print(type(s1),s1) 
    输出结果
    
    
    <class 'NoneType'> None
    <class 'set'> {'lisa', 'knight', 'pudding'}

    14、intersection_update()

    描述:交集运算,原集合更新

    参数:set  要对比的集合

    返回值:None(原集合会被修改)

    s1 = {'william','lisa','knight','pudding'}
    s2 = {'william','xxxx'}
    s3 = s1.intersection_update(s2)
    print(type(s3),s3)  # 返回None
    print(type(s1),s1)  # 原集合更新
    输出结果
    
    
    <class 'NoneType'> None
    <class 'set'> {'william'}

    15、isdisjoint()

    描述:判断是否有交集,如果有交集则返回False,没有返回True

    参数:set  要对比的集合

    返回值:返回一个布尔值

    s1 = {'william','lisa','knight','pudding'}
    s2 = {'xxxx','lisa'}
    s3 = s1.isdisjoint(s2)   # 有交集则返回False
    print(type(s3),s3)
    #--------------------------------------------
    s4 = {'william','lisa','knight','pudding'}
    s5 = {'xxxx','yyyyy','kkkkkk','uuuuuu'}
    s6 = s4.isdisjoint(s5)   # 没有交集则返回True
    print(type(s6),s6)
      输出结果:
    
    
    <class 'bool'> False
    <class 'bool'> True

    16、symmetric_difference_update()

    描述:对称差集运算,原集合更新

    参数:set  要对比的集合

    返回值:None(原集合会被修改)

    s1 = {'william','lisa','knight','pudding'}
    s2 = {'william','pudding','xxxxxx'}
    s3 = s1.symmetric_difference_update(s2)
    print(type(s3),s3)   # 返回None
    print(type(s1),s1)   # 对称差集运算,原集合更新
      输出结果:
    
    
    <class 'NoneType'> None
    <class 'set'> {'lisa', 'knight', 'xxxxxx'}

     

  • 相关阅读:
    [USACO08MAR]土地征用Land Acquisition
    树链剖分
    [AHOI2008]紧急集合 / 聚会
    P1852 [国家集训队]跳跳棋
    Ant Trip(欧拉回路+并查集)
    单词游戏
    POJ3694 Network
    C++ STL小总结
    2-Sat专题
    6大名家带你穿越大半个中国去深思
  • 原文地址:https://www.cnblogs.com/zhangningyang/p/7218622.html
Copyright © 2011-2022 走看看