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

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

原文地址:https://www.cnblogs.com/wdbgqq/p/9151820.html