• Python集合(Set)常用操作


    定义

    set是一个无序且不重复的元素集合。
    集合对象是一组无序排列可哈希的值,集合成员可以做字典中的键。集合用innot in操作符检查成员,以len()內建函数得到集合的基数(大小),用for循环迭代集合的成员。但是因为集合本身是无序的,不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。
    set和dict一样,只是没有value,相当于dict的key集合,由于dict的key是不重复的,且key是不可变对象因此set也有如下特性:

    1. 不重复
    2. 元素为不可变对象

    创建

    方式一

    先初始化再赋值

    s = set()
    s = {11,22,33,44}  #注意在创建空集合的时候只能使用s=set(),因为s={}创建的是空字典
    

    方式二

    直接创建

    a=set('boy')
    
    d={'k1','k2','k2'}
    

    方式三

    利用list创建

    b=set(['y', 'b', 'o','o'])
    

    方式四

    利用dict创建,将会使用dict中的key值作为set的值

    Input:

    c=set({"k1":'v1','k2':'v2'})
    c
    

    Output:

    {'k1', 'k2'}
    

    方式五

    使用tuple创建

    e={('k1', 'k2','k2')}
    

    更新(增加)

    update

    Input:

    se = {11, 22, 33}
    be = {22,44,55}
    
    se.update(be)  # 把se和be合并,得出的值覆盖se
    print(se)
    se.update([66, 77])  # 可增加迭代项
    print(se)
    

    Output:

    {33, 22, 55, 11, 44}
    {33, 66, 22, 55, 11, 44, 77}
    

    删除

    discard()remove()pop()

    Input:

    se = {11, 22, 33}
    se.discard(11)
    se.discard(44)  # 移除不存的元素不会报错
    print(se)
    

    Output:

    {33, 22}
    

    Input:

    se = {11, 22, 33}
    se.remove(11)
    se.remove(44)  # 移除不存的元素会报错
    print(se)
    

    Output:

        ---------------------------------------------------------------------------
    
        KeyError                                  Traceback (most recent call last)
    
        <ipython-input-15-7256c38824cb> in <module>()
              1 se = {11, 22, 33}
              2 se.remove(11)
        ----> 3 se.remove(44)  # 移除不存的元素会报错
              4 print(se)
    
    
        KeyError: 44
    

    集合操作

    交集

    intersection, intersection_update,也可以使用a&b

    Input:

    temp1 = se.intersection(be)             #取交集,赋给新值
    print(temp1)  # 22
    print(se)  # {11, 22, 33}
    
    temp2 = se.intersection_update(be)      #取交集并更新自己
    print(temp2)  # None
    print(se)  # 22
    print(se&be)
    

    Output:

    {22}
    {22}
    None
    {22}
    {22}
    

    并集

    union,也可以使用a|b

    Input:

    se = {11, 22, 33}
    be = {22,44,55}
    
    temp=se.union(be)   #取并集,并赋新值
    print(se)       #{33, 11, 22}
    print(temp)     #{33, 22, 55, 11, 44}
    print(se|be)
    

    Output:

    {33, 11, 22}
    {33, 22, 55, 11, 44}
    {33, 22, 55, 11, 44}
    

    差集

    difference, difference_update,也可以使用a-b

    Input:

    se = {11, 22, 33}
    be = {22, 55}
    temp1 = se.difference(be)        #找到se中存在,be中不存在的集合,返回新值
    print(temp1)        #{33, 11}
    print(se-be)
    print(se)        #{33, 11, 22}
    

    Output:

    {33, 11}
    {33, 11}
    {33, 11, 22}
    

    Input:

    temp2 = se.difference_update(be) #找到se中存在,be中不存在的集合,覆盖掉se
    print(temp2)        #None
    print(se)           #{33, 11}
    

    Output:

    None
    {33, 11}
    

    Input:

    se = {11, 22, 33}  # 移除末尾元素并把移除的元素赋给新值
    temp = se.pop()
    print(temp)  # 33
    print(se) # {11, 22}
    

    Output:

    33
    {11, 22}
    

    包含关系

    两个集合之间一般有三种关系,相交、包含、不相交。在Python中分别用下面的方法判断:

    • set.isdisjoint(s):判断两个集合是不是不相交
    • set.issuperset(s):判断集合是不是包含其他集合,等同于a>=b
    • set.issubset(s):判断集合是不是被其他集合包含,等同于a<=b

    如果要真包含关系,就用符号操作><

    Input:

    se = {11, 22, 33}
    be = {22}
    
    print(se.isdisjoint(be))        #False,判断是否不存在交集(有交集False,无交集True)
    print(se.issubset(be))          #False,判断se是否是be的子集合
    print(se <= be)
    print(se.issuperset(be))        #True,判断se是否是be的父集合
    print(se >= be)
    

    Output:

    False
    False
    False
    True
    True
    

    合并

    symmetric_difference, symmetric_difference_update

    Input:

    se = {11, 22, 33}
    be = {22}
    
    temp1 = se.symmetric_difference(be)  # 合并不同项,并赋新值
    print(temp1)    #{33, 11}
    print(se)       #{33, 11, 22}
    
    temp2 = se.symmetric_difference_update(be)  # 合并不同项,并更新自己
    print(temp2)    #None
    print(se)             #{33, 11}
    

    Output:

    {33, 11}
    {33, 11, 22}
    None
    {33, 11}
    

    集合的转换

    集合可以转换为list,tuple以及str

    Input:

    se = set(range(4))
    li = list(se)
    tu = tuple(se)
    st = str(se)
    print(li,type(li))
    print(tu,type(tu))
    print(st,type(st))
    

    Output:

    [0, 1, 2, 3] <class 'list'>
    (0, 1, 2, 3) <class 'tuple'>
    {0, 1, 2, 3} <class 'str'>
    

    不变集合

    Python提供了不能改变元素的集合的实现版本,即不能增加或删除元素,类型名叫frozenset,使用方法如下

    Input:

    a = frozenset("hello")
    a
    

    Output:

    frozenset({'e', 'h', 'l', 'o'})
    

    需要注意的是frozenset仍然可以进行集合操作,只是不能用带有update的方法。如果要一个有frozenset中的所有元素的普通集合,只需把它当作参数传入集合的构造函数中即可:

    Input:

    a = frozenset("hello")
    a = set(a)
    a.add(12)
    a
    

    Output:

    {12, 'e', 'h', 'l', 'o'}


  • 相关阅读:
    博客美化
    hello world
    mysql数据库索引
    Golang:线程 和 协程 的区别
    计算机网络详解
    Redis持久化机制
    nginx 详解
    多级缓存的分层架构
    svn忽略文件不提交至服务器的方法
    Mysql 事务及其原理
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/16602728.html
Copyright © 2020-2023  润新知