基础数据类型之集合和深浅copy,还有一些数据类型补充

Posted 杜杜精灵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础数据类型之集合和深浅copy,还有一些数据类型补充相关的知识,希望对你有一定的参考价值。

                      集合

集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

  去重,把一个列表变成集合,就自动去重了。

  关系测试,测试两组数据之前的交集、差集、并集等关系。

 

#关于集合和波尔值之间的苟苟且且
# 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)


经过我一些神神叨叨的实验,得出以下结论

列表
当循环列表时,如果在循环中删除某个或者某些元素,列表元素个数改变,索引改变,容易出错。
列表这个在循环删除的时候可以从后往前删除,这样前面的索引不会变化,至于后面的那就无所谓了,后面改变也不影响循环

字典
当循环字典时,如果在循环中删除某个或者某些键值对,字典的键值对个数改变,长度改变,容易出错。

 

 

 

以上是关于基础数据类型之集合和深浅copy,还有一些数据类型补充的主要内容,如果未能解决你的问题,请参考以下文章

python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象

集合和深浅copy

python-深浅拷贝

Python全栈__数据类型的补充集合set深浅copy

python--基础数据类型的补充与深浅copy

Python深浅拷贝