zoukankan      html  css  js  c++  java
  • python基本数据类型之集合

    python基本数据类型之集合

    集合是一种容器,用来存放不同元素。
    集合有3大特点:

    1. 集合的元素必须是不可变类型(字符串、数字、元组);
    2. 集合中的元素不能重复;
    3. 集合是无序的。

    在集合中直接存入list或字典类型会直接报错;在创建集合时,重复元素会被剔除;集合是无序的,即集合中的元素无法通过索引进行访问。

    集合的定义

    集合的定义有两种方式:1、直接定义,即使用大括号{}来表示集合;2、使用set方法从序列中创建集合。

    # 第一种方式:使用大括号表示集合,元素之间用逗号隔开
    s1 = {'haha', 12, ('nihao', 'yes')}
    print(s1)
    
    # 第二种方式:从可遍历对象中创建集合
    s2 = set('goodmorning')
    print(s2)
    

    打印结果:

    {('nihao', 'yes'), 12, 'haha'}
    {'o', 'd', 'n', 'i', 'm', 'r', 'g'}
    

    可以看到,创建的集合中,重复元素会自动地去除,并且元素的顺序与创建时也有所不同。
    集合本身属于可变类型,python提供了许多内置方法来修改集合中的元素;python还提供了另一种不可变的集合,叫frozenset。

    fs = frozenset(['haha', 123, (123, 'yeye')])
    print(fs)
    

    打印结果:

    frozenset({'haha', 123, (123, 'yeye')})
    

    集合元素的添加和删除

    集合中的方法有:addupdate、clearpop emovediscard、differencedifference_update、intersectionintersection_update、symmetric_differencesymmetric_difference_update、isdisjointissubsetissuperset、copy、union。

    1、添加方法

    add方法可以向集合中添加指定元素。

    s = {'haha', 'hello', 123, ('gu', 887)}
    s.add('good')
    print(s)
    

    打印结果:

    {'haha', ('gu', 887), 'good', 'hello', 123}
    

    但是add方法每次只能添加一个元素,如果需要添加多个元素,可以使用update方法。

    s = {'haha', 'hello', 123, ('gu', 887)}
    s.update({'nihao', 222})
    print(s)
    

    打印结果:

    {'haha', ('gu', 887), 'hello', 123, 222, 'nihao'}
    

    update传入的参数可以是其他的可遍历类型,如字符串、列表、元组等,update方法会将这些序列进行遍历后将元素单个存入集合。
    如果update中传入的参数是字典类型,则集合中只会保留字典的key值。(add方法传入的参数必须是不可变类型,所以不能传入字典)。

    s = {'haha', 'hello', 123, ('gu', 887)}
    
    d = {
        'name': 'harry',
        'age': 11
    }
    s.update(d)
    print(s)
    

    打印结果:

    {'age', 'name', ('gu', 887), 'haha', 123, 'hello'}
    

    2、删除方法

    集合的删除方法有:clear、pop、remove和discard。clear方法是清空集合,用法与字典、列表中的clear方法一致。
    集合中的pop方法是随机删除集合中的一个元素并返回。pop方法不需要任何参数。

    s = {'haha', 'hello', 123, ('gu', 887)}
    
    v = s.pop()
    print(v, s)
    

    打印结果:haha {123, ('gu', 887), 'hello'}
    pop方法是随机删除,因此你无法控制程序删除哪一个。而remove和discard方法都可以指定要删除的元素。

    s = {'haha', 'hello', 123, ('gu', 887)}
    
    s.remove('hello')
    print(s)
    
    s.discard(123)
    print(s)
    

    打印结果:

    {'haha', 123, ('gu', 887)}
    {'haha', ('gu', 887)}
    

    remove与discard方法不同的地方在于:如果要删除的元素不存在,remove方法会报错,而discard方法不会。

    s = {'haha', 'hello', 123, ('gu', 887)}
    
    s.discard(222)
    print(s)
    

    打印结果:{123, ('gu', 887), 'haha', 'hello'}
    如果元素不存在,discard方法不会对集合进行任何更改。因此在实际运用中,一般都会使用discard方法。

    集合的关系运算

    python中的集合可以进行类似于数学集合一样的运算。python中集合的运算包括:交集(intersection)、并集(union)、差集(difference)以及交叉补集(symmetric_difference)。

    1、集合的交集

    集合的交集就是求在两个集合中都存在的元素,python会将这些元素作为新的集合返回。

    s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
    s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'}
    
    v = s1.intersection(s2)
    print(v)
    

    打印结果:

    {'Ron', 'Tom'}
    

    集合的交集使用intersection方法,但是也有一种更为简便的写法:

    v = s1 & s2
    print(v)
    

    打印结果:{'Tom', 'Ron'}
    &的方法就是表示求两个集合的交集,对于多于两个集合求交,也可以使用这个符号。

    s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
    s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'}
    s3 = {'Lily', 'Finger', 'Ron', 'Stanford'}
    
    v = s1 & s2 & s3 # &表示AND(和)。
    print(v)
    

    打印结果:{'Ron'}

    2、集合的并集

    集合的并集表示将两个集合中的元素全部放在一个集合中,并去除重复元素。求并集使用的方法是union:

    s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
    s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'}
    
    v = s1.union(s2)
    print(v)
    

    打印结果:

    {'Homonie', 'Jerry', 'Ron', 'Tom', 'Harry', 'Hagrid'}
    

    求并集的简写方法是使用'|'符号,这个符号表示OR(或)的意思。

    v = s1 | s2
    print(v)
    

    打印结果与使用union时一样。

    3、集合的差集

    集合的s1与s2的差集表示存在于s1中的但不存在于s2中的元素,差集的方法是difference。同样,求差集也可以简写,差集的符号就是一个减号。

    s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
    s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'}
    
    v = s1.difference(s2)
    print(v)
    
    v1 = s1 - s2
    print(v1)
    

    打印结果:

    {'Harry', 'Jerry'}
    {'Harry', 'Jerry'}
    

    求差集的顺序颠倒过来(s2 - s1)就表示存在于s2中但不存在于s1中的元素。

    4、交叉补集

    集合的另一种关系运算叫做交叉补集,具体说明先看例子:

    s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
    s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'}
    
    v = s1.symmetric_difference(s2)
    print(v)
    

    打印结果:

    {'Hagrid', 'Jerry', 'Harry', 'Homonie'}
    

    该运算是首先将两个集合内的元素合并,之后去除两个集合共有的元素。在上述例子中,s1与s2合并后的集合为{'Harry', 'Homonie', 'Tom', 'Jerry', 'Hagrid', 'Ron'},s1与s2中共有的元素为:{'Ron', 'Tom'},因此s1与s2的交叉补集就是:

    {'Hagrid', 'Jerry', 'Harry', 'Homonie'}
    

    交叉补集也有一个简便的运算符号:^

    v = s1 ^ s2
    print(v)
    

    5、xxx_update方法

    在集合的关系运算中,有几个对应的update方法,该方法表示s1在与另一个集合进行关系运算后,将所得集合重新赋给s1。
    存在update方法的运算有:交(intersection_update)、差(difference_update)和交叉补集(symmertric_difference_update)。
    例如:

    s1 = {'Tom', 'Jerry', 'Harry', 'Ron'}
    s2 = {'Homonie', 'Ron', 'Hagrid', 'Tom'}
    
    s1.intersection_update(s2)
    print(s1)
    

    打印结果:{'Tom', 'Ron'}
    注意:union没有_update方法

    集合的关系判断

    集合的判断方法有3个:isdisjoint、issubset和issuperset

    1、isdisjoint方法

    该方法用来判断两个集合是否有共有元素,也就是判断它们是否存在交集。如果两个集合没有交集,则返回True;如果两个集合存在共有元素(交集),则返回False。

    s1 = {1, 2, 3}
    s2 = {4, 5, 6}
    s3 = {1, 7, 8}
    
    v = s1.isdisjoint(s2)
    print(v)
    v1 = s1.isdisjoint(s3)
    print(v1)
    

    打印结果:

    True
    False
    

    2、issubset、issuperset方法

    issubset方法用来判断一个集合是否是另一个集合的子集;而issuperset则是判断是否是另一个集合的父集。

    s1 = {1, 2, 3, 4, 5}
    s2 = {2, 3}
    s3 = {5, 7}
    
    v1 = s2.issubset(s1)
    print('s2是否是s1的子集--->', v1)
    
    v2 = s3.issubset(s1)
    print('s3是否是s1的子集--->', v2)
    
    v3 = s1.issuperset(s2)
    print('s1是否是s2的父集--->', v3)
    

    打印结果:

    s2是否是s1的子集---> True
    s3是否是s1的子集---> False
    s1是否是s2的父集---> True
    

    每个集合也是自己本身的子集和父集:

    v4 = s1.issubset(s1)
    print('s1是否是s1(自身)的子集--->', v4)
    
    v5 = s1.issuperset(s1)
    print('s1是否是s1(自身)的父集--->', v5)
    

    打印结果:

    s1是否是s1(自身)的子集---> True
    s1是否是s1(自身)的父集---> True
    

    issubset方法的运算关系其实相当于:<=(即小于等于);而issuperset方法的运算关系相当于:>=(大于等于)。

    # 使用<=判断子集:
    v1 = s2.issubset(s1)
    print('s2是否是s1的子集--->', v1)
    
    v2 = s2 <= s1
    print(v2)
    
    v3 = s3 <= s1
    print(v3)
    
    # 使用>=判断父集:
    v4 = s1 >= s3
    print('s1 >= s3 ?', v4)
    

    打印结果:

    s2是否是s1的子集---> True
    True
    False
    s1 >= s3 ? False
    

    3、关于集合中的运算符号

    集合中除了>= 和 <= 符号外,还可以使用>、< 和 = 来判断集合间的关系。具体比较结果如下:

    s1 = {1, 2, 3, 4, 5}
    s2 = {1, 2, 3}
    s3 = {1, 2, 3, 4, 5}
    
    v1 = s1 > s2
    v2 = s1 >= s2
    print('s1 > s2 吗?--->', v1)
    print('s1 >= s2 吗?--->', v2)
    
    v3 = s1 > s3
    v4 = s1 >= s3
    print('s1 > s3 吗?--->', v3)
    print('s1 >= s3 吗?--->', v4)
    

    打印结果:

    s1 > s2 吗?---> True
    s1 >= s2 吗?---> True
    s1 > s3 吗?---> False
    s1 >= s3 吗?---> True
    

    可以这样理解:<= 与 >=都是来判断集合之间是否是子集和父集的;而 < 与 > 是来判断集合之间是否是真子集或'真父集'的关系的。

  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/guyexiangyun/p/10256109.html
Copyright © 2011-2022 走看看