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