zoukankan      html  css  js  c++  java
  • python set 集合详解

    Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。

    从形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔,如下所示:

    {element1,element2,...,elementn}

     从内容上看,同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误。

    并且需要注意的是,数据必须保证是唯一的,因为集合对于每种数据元素,只会保留一份 

     Python 提供了 2 种创建 set 集合的方法,分别是使用 {} 创建和使用 set() 函数将列表、元组等类型数据转换为集合。

    [root@kube set]# cat demo.py 
    a = {1,2,1,'test','hi','test','one'}
    print(type(a))
    print(a)
    [root@kube set]# py demo.py 
    <class 'set'>
    {'hi', 1, 2, 'one', 'test'}
    [root@kube set]# 
    set1 = set("c.biancheng.net")
    set2 = set([1,2,3,4,5])
    set3 = set((1,2,3,4,5))
    print("set1:",set1)
    print("set2:",set2)
    print("set3:",set3)

    注意,如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典。

    python 访问set集合元素

    由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。

    [root@kube set]# cat demo.py 
    a = {1,2,1,'test','hi','test','one'}
    print(type(a))
    for ele in a:          #遍历查看
        print(ele,end='--')
    
    del a             #删除
    print(a)
    [root@kube set]# py demo.py 
    <class 'set'>
    1--2--hi--test--one--Traceback (most recent call last):
      File "demo.py", line 7, in <module>
        print(a)
    NameError: name 'a' is not defined
    [root@kube set]# 

     Python set集合基本操作(添加、删除、交集、并集、差集)

     Python set 集合最常用的操作是向集合中添加、删除元素,以及集合之间做交集、并集、差集等运算,本节将一一讲解这些操作的具体实现。

    [root@kube set]# cat demo1.py 
    a = {1,2,'three','four',(5,6)}
    b = {1,8,'th','fo',(5,6)}
    c = {1,2,'three','four',(5,6)}
    d = {1,8,'th','fo',(5,6)}
    a.add('hi')                      #add() 函数添加,每次接收一个参数
    b.remove((5,6))                  #remove 删除,每次只接收一个参数
    print(a)
    print(b)
    [root@kube set]# py demo1.py 
    {1, 2, 'four', (5, 6), 'hi', 'three'}
    {1, 8, 'th', 'fo'}
    [root@kube set]# 

     Python set集合做交集、并集、差集运算

    图 1 中,有 2 个集合,分别为 set1={1,2,3} 和 set2={3,4,5},它们既有相同的元素,也有不同的元素。以这两个集合为例,分别做不同运算的结果如表 1 所示。

    表 1 Python set集合运算
    运算操作Python运算符含义例子
    交集 & 取两集合公共的元素 >>> set1 & set2
    {3}
    并集 | 取两集合全部的元素 >>> set1 | set2
    {1,2,3,4,5}
    差集 - 取一个集合中另一集合没有的元素 >>> set1 - set2
    {1,2}
    >>> set2 - set1
    {4,5}
    对称差集 ^ 取集合 A 和 B 中不属于 A&B 的元素 >>> set1 ^ set2
    {1,2,4,5}
    [root@kube set]# cat demo1.py 
    a = {1,2,'three','four',(5,6)}
    b = {1,8,'th','fo',(5,6)}
    print(a & b) #求交集
    print(a | b) #求合集
    print(a - b) #求差集
    print(a ^ b) #求对称差集,就是除了交集剩下的所有
    [root@kube set]# py demo1.py 
    {(5, 6), 1}
    {1, 2, 'three', (5, 6), 8, 'th', 'four', 'fo'}
    {'four', 2, 'three'}
    {'fo', 2, 'three', 'four', 8, 'th'}
    [root@kube set]# 

     Python set集合方法详解

    >>> dir(set)
    ['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
    >>> 

    各个方法的具体语法结构及功能如表 1 所示。

    表 1 Python set方法
    方法名语法格式功能实例
    add() set1.add() 向 set1 集合中添加数字、字符串、元组或者布尔类型 >>> set1 = {1,2,3}
    >>> set1.add((1,2))
    >>> set1
    {(1, 2), 1, 2, 3}
    clear() set1.clear() 清空 set1 集合中所有元素 >>> set1 = {1,2,3}
    >>> set1.clear()
    >>> set1
    set()

    set()才表示空集合,{}表示的是空字典
    copy() set2 = set1.copy() 拷贝 set1 集合给 set2 >>> set1 = {1,2,3}
    >>> set2 = set1.copy()
    >>> set1.add(4)
    >>> set1
    {1, 2, 3, 4}
    >>> set1
    {1, 2, 3}
    difference()  set3 = set1.difference(set2) 将 set1 中有而 set2 没有的元素给 set3 >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set3 = set1.difference(set2)
    >>> set3
    {1, 2}
    difference_update() set1.difference_update(set2) 从 set1 中删除与 set2 相同的元素 >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set1.difference_update(set2)
    >>> set1
    {1, 2}
    discard() set1.discard(elem) 删除 set1 中的 elem 元素 >>> set1 = {1,2,3}
    >>> set1.discard(2)
    >>> set1
    {1, 3}
    >>> set1.discard(4)
    {1, 3}
    intersection() set3 = set1.intersection(set2) 取 set1 和 set2 的交集给 set3 >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set3 = set1.intersection(set2)
    >>> set3
    {3}
    intersection_update() set1.intersection_update(set2) 取 set1和 set2 的交集,并更新给 set1 >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set1.intersection_update(set2)
    >>> set1
    {3}
    isdisjoint() set1.isdisjoint(set2) 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set1.isdisjoint(set2)
    False
    issubset() set1.issubset(set2) 判断 set1 是否是 set2 的子集 >>> set1 = {1,2,3}
    >>> set2 = {1,2}
    >>> set1.issubset(set2)
    False
    issuperset() set1.issuperset(set2) 判断 set2 是否是 set1 的子集 >>> set1 = {1,2,3}
    >>> set2 = {1,2}
    >>> set1.issuperset(set2)
    True
    pop() a = set1.pop() 取 set1 中一个元素,并赋值给 a >>> set1 = {1,2,3}
    >>> a = set1.pop()
    >>> set1
    {2,3}
    >>> a
    1
    remove() set1.remove(elem) 移除 set1 中的 elem 元素 >>> set1 = {1,2,3}
    >>> set1.remove(2)
    >>> set1
    {1, 3}
    >>> set1.remove(4)
    Traceback (most recent call last):
      File "<pyshell#90>", line 1, in <module>
        set1.remove(4)
    KeyError: 4
    symmetric_difference() set3 = set1.symmetric_difference(set2) 取 set1 和 set2 中互不相同的元素,给 set3 >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set3 = set1.symmetric_difference(set2)
    >>> set3
    {1, 2, 4}
    symmetric_difference_update() set1.symmetric_difference_update(set2) 取 set1 和 set2 中互不相同的元素,并更新给 set1 >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set1.symmetric_difference_update(set2)
    >>> set1
    {1, 2, 4}
    union() set3 = set1.union(set2) 取 set1 和 set2 的并集,赋给 set3 >>> set1 = {1,2,3}
    >>> set2 = {3,4}
    >>> set3=set1.union(set2)
    >>> set3
    {1, 2, 3, 4}
    update() set1.update(elem) 添加列表或集合中的元素到 set1 >>> set1 = {1,2,3}
    >>> set1.update([3,4])
    >>> set1
    {1,2,3,4}

    Python frozenset集合(set集合的不可变版本)

    frozenset 是 set 的不可变版本,因此 set 集合中所有能改变集合本身的方法(如 add、remove、discard、xxx_update 等),frozenset 都不支持;set 集合中不改变集合本身的方法,fronzenset 都支持。

    在交互式解释器中输入 dir(frozenset) 命令来查看 frozenset 集合的全部方法,可以看到如下输出结果:

    >>> dir(frozenset)
    ['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
    >>> 

    很明显,frozenset 的这些方法和 set 集合同名方法的功能完全相同。

    frozenset 的作用主要有两点:

      1. 当集合元素不需要改变时,使用 frozenset 代替 set 更安全。
      2. 当某些 API 需要不可变对象时,必须用 frozenset 代替set。比如 dict 的 key 必须是不可变对象,因此只能用 frozenset;再比如 set 本身的集合元素必须是不可变的,因此 set 不能包含 set,set 只能包含 frozenset。
    [root@kube set]# cat demo2.py 
    s = set()
    #创建 frozenset 不可变集合,使用 frozenset() 函数
    frozen_s = frozenset('Kotlin')
    # 为set集合添加frozenset
    s.add(frozen_s)
    print('s集合的元素:', s)
    sub_s = {'Python'}
    # 为set集合添加普通set集合,程序报错
    s.add(sub_s)
    [root@kube set]# py demo2.py 
    s集合的元素: {frozenset({'o', 't', 'l', 'n', 'K', 'i'})}
    Traceback (most recent call last):
      File "demo2.py", line 9, in <module>
        s.add(sub_s)
    TypeError: unhashable type: 'set'
    [root@kube set]# 

     浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。

    所谓深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。

     Python 中以 copy.deepcopy() 来实现对象的深度拷贝

    copy这部分参考: http://c.biancheng.net/view/5358.html

  • 相关阅读:
    kubectl命令行工具
    资源编排(YAML)
    vscode自定义vue模板代码
    vscode10个必装的插件
    【转】Android系统开篇
    Android应用资源分析(老罗链接整理)
    APK优化工具zipalign的详细介绍和使用
    Android中APK签名工具之jarsigner和apksigner详解
    Android反编译和二次打包
    python修饰器(装饰器)以及wraps
  • 原文地址:https://www.cnblogs.com/zy09/p/11599261.html
Copyright © 2011-2022 走看看