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
    

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

  • 相关阅读:
    从Memcache转战Redis,聊聊缓存使用填过的“坑”
    python playbook 启动redis
    《非常网管:网络管理从入门到精通(修订版)》——第1章 网络基础知识回顾1.1 计算机网络基础...
    《非常网管:网络管理从入门到精通(修订版)》——第1章 网络基础知识回顾1.1 计算机网络基础...
    《Python游戏编程快速上手》——1.3 如何使用本书
    《Python游戏编程快速上手》——1.3 如何使用本书
    《Python游戏编程快速上手》——1.3 如何使用本书
    《Arduino实战》——3.4 小结
    《Arduino实战》——3.4 小结
    《Arduino实战》——3.4 小结
  • 原文地址:https://www.cnblogs.com/guyexiangyun/p/10256109.html
Copyright © 2011-2022 走看看