集合
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
去重,把一个列表变成集合,就自动去重了。
关系测试,测试两组数据之前的交集、差集、并集等关系。
#关于集合和波尔值之间的苟苟且且 # set ={1,2,3,4,5,True,(1,2,3),} #集合具有自动去重和去空格功能 # set.add(False) # set.add(True) #打印结果显示,没有Teue,应该是集合内部的数字和元组不是空是True,去重就把True去掉了 # print(set) # set.update(False) #update是随机迭代增加,布尔值不是迭代对象,所以只能用add增加 # print(set) # set.update(True) # print(set) #删除 # set = {1,2,3,4,5,(789),6} # set.pop() #随机删除,有返回值 # print(set) #交集 # set = {1,2,3,4} # set1 = {3,4,5,6,7} # print(set.intersection(set1)) # print(set&set1) #并集 并集也可以去两个集合的重 # set = {1,2,3,4} # set2 = {3,4,5,6,7,8} # print(set.union(set2)) # print(set|set2) #差集 # set = {1,2,3,4,5} # set3 = {4,5,6,7} # print(set.difference(set3)) # print(set - set3) #反交集 #两个集合相同的去掉 # set = {1,2,3,4,5} # set4 = {4,5,6,7,8} # print(set.symmetric_difference(set4)) # print(set ^ set4) #超集 子集 # set = {1,2,3,4} # set5 = {1,2,3,4,5,6,7} # print(set5.issuperset(set)) #判断set5是不是set的爸爸,返回波尔值 # print(set.issubset(set5)) #判断set是不是set5的儿子,返回波尔值 # print(set5 > set) # print(set < set5) #把集合冻住,使其成为不可变数据类型 # set = {1,2,3,4,5,6} # print(frozenset(set))
深浅copy
浅copy 通过赋值之后,两个值内存地址不同,在数据有嵌套的情况下,嵌套部分内存地址相同,无论嵌套多少层都一样
深copy必须调用copy模块才能使用 import copy deepcopy 深copy就是通过赋值之后,值得内存地址完全不同,无论嵌套多少层都一样
基础数据类型补充
现在我莫名其妙有一个需求dic = {'k1':'v1','k2':'v2','a3':'v3'},我现在看着字典不顺眼,准备收拾它,就想着把它的带元素k的键删掉怎么办
按照正常思路来一下,这个字典有多大咱们不知道,也许里面储存了上亿的带k大军,所以我用循环删
dic = {'k1':'v1','k2':'v2','a3':'v3'}
for i in dic:
if 'k' in i:
del dic[i]
print(dic)
结果报错,说是字典长度改变了。。。我觉得废话,我要删除长度肯定改变啊,总之不让删咋整。。。
然后,我踩在前人的肩膀上抄了这样一份代码解决了问题
# dic = {'k1':'v1','k2':'v2','a3':'v3'} # l = [] # for i in dic: # if 'k' in i: # l.append(i) # for i in l: #关键在这里和下面,执行的是循环列表,但是删除的是字典,无耻啊 # del dic[i] #现在字典可以删除,因为现在不是边循环字典边删除,而是先判断出字典的带k大军放到列表里,循环列表就相当于循环字典带k大军,此时字典的带k大军就被删除了 # print(dic) 然后我又抄了第二份。。。
# dic = {'k1':'v1','k2':'v2','a3':'v3'} # dic1 = {} # for i in dic.keys(): # if 'k' not in i: # dic1.setdefault(i,dic[i]) # dic = dic1 # print(dic) 经过我一些神神叨叨的实验,得出以下结论
列表 当循环列表时,如果在循环中删除某个或者某些元素,列表元素个数改变,索引改变,容易出错。 列表这个在循环删除的时候可以从后往前删除,这样前面的索引不会变化,至于后面的那就无所谓了,后面改变也不影响循环 字典 当循环字典时,如果在循环中删除某个或者某些键值对,字典的键值对个数改变,长度改变,容易出错。