• set集合 深浅拷贝 以及部分知识点补充


    set集合  深浅拷贝  以及部分知识点补充

    一  部分知识点补充

      1.基础数据类型补充

      a.join

    li=["马化腾","许家印","王健林"]
    print("*".join(li))
    结果:   马化腾*许家印*王健林

      join可以将列表转换为字符串,切记!而split则可将字符串切割成列表!

      

    s="我叫王先生!"
    print("_".join(s))      #我_叫_王_先_生_!
    
    s="我叫王先生!"
    print(s.split(""))      #['我叫', '先生!']

      b.循环列表的删除

      

    li=[11,22,33,44,55]
    for el in li:
        li.remove(el)
    print(li)
    结果:  [22, 44]

      这是为什么呢?为什么没能将li中元素全部删完呢?

      分析原因:在循环过程中,会有一个指针来记录当前所指的是哪一个元素,刚开始指针指向0位置,而当0位置元素删除后,后边元素补充0位置,此时指针已移向1位置,故当前0位置元素未被删除,依次类推,此操作无法完成列表元素完全删除.

      再试试以下方法:

    li=[11,22,33,44,55]
    for i in range(0,len(li)):
        del li[0]
    print(li)
    
    结果:[]

      这次为什么能实现呢?我们将要删除的元素始终定位到0位,不管删除哪个元素,我们的指针始终指向0位置,保证所有元素能被删除.

      保险起见,我们可考虑一种更为妥当的方法来实现循环过程中的删除.

      

    li=["中国","美国","日本","韩国"]
    new_li=[]
    for el in li:
        new_li.append(el)
    for e in new_li:
        li.remove(e)
    print(li)

      我先新建一个新列表new_li,然后将li中每一个元素通过循环加到新列表,此时新列表与旧列表具有相同的元素,接着我们来循环新列表,通过循环新列表来删除旧列表中对应的元素.这样通过循环新列表来删除旧列表的方法,既由新列表获得了要删除的元素,又因为不影响循环过程而得以实现所有元素的删除任务.

      注意:由于删除元素会导致元素索引的改变,容易出现问题,所以尽量不要在循环中去删除元素,可以把要删除元素的另一个集合中再批量删除.

       dic中的fromkey()可以帮助我们通过list来新建一个dic

      

        

      dic在迭代过程中是不允许改变的

    dic={"k1":"大王","k2":"二王","k3":"小王"}
    for k in dic:
        if 'k' in k:
            del dic[k]
    print(dic)    #RuntimeError: dictionary changed size during iteration

      可以把要删除的元素保存到一个List中,通过循环此列表实现元素的删除

    dic={"k1":"大王","k2":"二王","k3":"小王"}
    del_lis=[]
    for k in dic:
        if 'k' in k:
            del_lis.append(k)
    for el in del_lis:
        del dic[el]
    print(dic)  
    
    结果:{}

      2.类型转换

    二 set 集合

      1.set 集合的特点:

      由{}表示,set就是存储key,set集合不会重复,是无序的,内容必须是可哈希的(不可变的类型),但其本身是不可哈希的(可变的),

      **可以用set 来去重复

      **set的初始  s=({})   或  s=set()

      2.set集合的相关操作

      增: s.add()   重复的内容不会被更新到set中    s.update()    迭代更新

    s={2,3,1,4,5,3}
    s.add(1)
    print(s)     结果  {1, 2, 3, 4, 5}
    s={2,3,1,4,5,3}
    s.update("哈喽空调")
    print(s)     结果   {1, 2, 3, 4, 5, '哈', '空', '喽', '调'}   

      删:  s.pop()    随机删除     s.remove()   删除指定元素    s.clear()   清空集合-----清空后的集合打印出来显示为s(),目的是为了和字典区分  

      改: 因为集合没有索引,也无法定位某一元素,所以没有单独删除办法,可通过先再添加的方法实现修改

      查: set是一个可迭代的对象,可通过for循环来实现其中元素查找

      其他操作:  交集   s1&s2----s1.intersection(s2)     并集   s1|s2----s1.union(s2)        差集  s1-s2-------s1.difference(s2)

      set集合本身不可哈希,需要可哈希的时候,使用.frozenset()

    三  深浅拷贝

      浅拷贝

    lst1=["","",""]
    lst2=lst1.copy()
    lst1.append("")
    print(lst1)
    print(lst2)
    print(id(lst1),id(lst2))
    
    结果
    ['', '', '', '']
    ['', '', '']
    20272392 29257440

    两个列表完全不一样,内存地址和内容也不一样,实现了内存的拷贝

      

    lst1=["","","",["",""]]
    lst2=lst1.copy()
    lst1[3].append("")
    print(lst1)
    print(lst2)
    print(id(lst1[3]),id(lst2[3]))
    
    结果
    ['', '', '', ['', '', '']]
    ['', '', '', ['', '', '']]
    20206856 20206856

      浅拷贝只拷贝第一层,第二层内容不会变

      深拷贝

    import copy
    lst1=["","","",["",""]]
    lst2=copy.deepcopy(lst1)
    lst1[3].append("")
    print(lst1)
    print(lst2)
    print(id(lst1[3]),id(lst2[3]))
    
    结果
    ['', '', '', ['', '', '']]
    ['', '', '', ['', '']]
    29640584 29419120

      两个列表,以及地址都不一样了,深度拷贝,把元素内部的元素完全进行复制,不会出现一个改变另一个跟着改变的问题.

  • 相关阅读:
    安卓adb
    图数据库学习
    分布式架构演进
    多活架构
    异地多活
    分布式CRDT
    技术架构的战略和战术原则
    分布式金融架构课笔记
    使用jackson进行json序列化时进行敏感字段脱敏(加密)或者忽略
    读书笔记《演进式架构》
  • 原文地址:https://www.cnblogs.com/wdbgqq/p/9151820.html
Copyright © 2020-2023  润新知