学习python的第十天(集合数据类型,拷贝,深拷贝,浅拷贝)
程序员文章站
2022-04-19 13:17:13
5.9自我总结 1.集合数据类型 1.定义 用{}中间值用,隔开,且集合中元素排列是无序的,而且如果有相同元素会只保留一个 2.算法 1.必须掌握 1.长度len 2.成员运算in和not in 3.并集(union或者|) ) 4.交集(intersection或者&) ) 5差集(differe ......
5.9自我总结
1.集合数据类型
1.定义
用{}中间值用,隔开,且集合中元素排列是无序的,而且如果有相同元素会只保留一个
2.算法
1.必须掌握
1.长度len
set_1 = {1,2,3,4,5} print(len(set_1)) #5
2.成员运算in和not in
#表示判断集合里面是否有某个值 set_1 = {1,2,3,4,5} print(1 in set_1) #true print(100 in set_1) #false
3.并集(union或者|)
#两个集合的集合综合,union或者| set_1 = {1,2,3} set_2 = {3,4,5} set_3 = set_1.union(set_2) set_4 = (set_1 | set_2) print(set_3) print(set_4) #{1, 2, 3, 4, 5}
)
4.交集(intersection或者&)
set_1 = {1,2,3} set_2 = {3,4,5} set_3 = set_1.intersection(set_2) set_4 = (set_1 & set_2) print(set_3) print(set_4) #{2}
)
5差集(difference 或者 -)
set_1 = {1,2,3} set_2 = {3,4,5} set_3 = set_1.difference(set_2) set_4 = (set_1 - set_2) print(set_3) print(set_4) #{1,2}
6.对称差集
set_1 = {1,2,3} set_2 = {3,4,5} set_3 = set_1.symmetric_difference(set_2) set_4 = (set_1 ^ set_2) print(set_3) print(set_4) #{1, 2, 4, 5}
7.集合内容是否相同(==)
set_1 = {1,2,3} set_2 = {3,4,5} print(set_1 == set_2) #false
8.父集(>或者>=或者issuperset)
set_1 = {1,2,3} set_2 = {1,2,3} set_3 = set_1.issuperset(set_2) #issuperset与>=意思相同 set_4 = (set_1 > set_2) #如果set_2 = {2},结果也为true print(set_3) #true print(set_4) #false
9.子集(<或者)
set_1 = {1,2,3} set_2 = {1,2,3} set_3 = set_1.issubset(set_2) #issubset与<=意思相同 set_4 = (set_1 < set_2) #如果set_2 = {2},结果也为true print(set_3) #true print(set_4) #false
2.掌握
1.add
添加,打印添加时候回返回none
2.remove
移除,打印添加时候回返回none,找不到移除的内容会报错
3.difference_update
删除相同的值 打印添加时候回返回none
4.discard
移除,打印添加时候回返回none,找不到移除的内容也会返回none
5.isdisjoint
判断有无交集
3.一个值或多个值
一个值
4,有序的或无序的
无序的
5.可变的或不可变
可变
2.深拷贝,浅拷贝,拷贝
比如说a拷贝b,a里面的值发送变化时候b也会发生变化,浅拷贝和深拷贝一般出现在一个变量里有多个元素,有可变的元素和不可变的元素,比如若说a浅拷贝b,其中b可变元素变了,a也变了,b中不可变元素变了,a不会变,深拷贝则是,其中不管哪个元素变了后,两者互不影响受限。
3.今日题目
第一部分
有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合。
pythons={'jason','nick','sean','tank','gangdan','tiepao'} linuxs={'tank','oldboy','gangdan'}
-
求出即报名python又报名linux课程的学员名字集合
pythons={'jason','nick','sean','tank','gangdan','tiepao'} linuxs={'tank','oldboy','gangdan'} pythons_linuxs = pythons & linuxs print(pythons_linuxs)
-
求出所有报名的学生名字集合
pythons={'jason','nick','sean','tank','gangdan','tiepao'} linuxs={'tank','oldboy','gangdan'} pythons_linuxs = pythons | linuxs print(pythons_linuxs)
-
求出只报名python课程的学员名字
pythons={'jason','nick','sean','tank','gangdan','tiepao'} linuxs={'tank','oldboy','gangdan'} pythons_linuxs = pythons - linuxs print(pythons_linuxs)
-
求出没有同时这两门课程的学员名字集合
pythons={'jason','nick','sean','tank','gangdan','tiepao'} linuxs={'tank','oldboy','gangdan'} pythons_linuxs = pythons ^ linuxs print(pythons_linuxs)
第二部分
-
有列表
l=['a','b',1,'a','a']
,列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序#去重 l=['a','b',1,'a','a'] new_l = set(l)
-
在上题的基础上,保存列表原来的顺序
#第一种,想法,先用set把他变成有序,再找到相同的删掉在原来的位置,后面循环发现删了后索引没法索引,就根据长度再套了个循环 l=['a','b',1,'a','a'] l_2 = set(l) while len(l) != len(l_2): for v_1 in range(len(l)): for v_2 in range(1,len(l)): if l[v_1] == l[v_2]: d = v_2 break del l[d] print(l) #第二种 做第三题发现里面有字典没法转换成set,想到这样,后来发现这样就可以了。。 l_2 = [] for a in l: if a not in l_2: l_2.append(a) print(l_2)
有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序
l=[ {'name':'nick','age':18,'sex':'male'}, {'name':'tank','age':73,'sex':'male'}, {'name':'nick','age':20,'sex':'female'}, {'name':'nick','age':18,'sex':'male'}, {'name':'nick','age':18,'sex':'male'}, ]
#第一种 l=[ {'name':'nick','age':18,'sex':'male'}, {'name':'tank','age':73,'sex':'male'}, {'name':'nick','age':20,'sex':'female'}, {'name':'nick','age':18,'sex':'male'}, {'name':'nick','age':18,'sex':'male'}, ] l_2 = [] for a in l: if a not in l_2: l_2.append(a) while len(l) != len(l_2): for v_1 in range(len(l)): for v_2 in range(1,len(l)): if l[v_1] == l[v_2]: d = v_2 break del l[d] print(l) #第二种 由于列表里有字典没法set,然后想到这样加进去,后面就这样了 l_2 = [] for a in l: if a not in l_2: l_2.append(a) print(l_2)
第三部分
- 请简述拷贝、浅拷贝、深拷贝三者之间的区别:
比如说a拷贝b,a里面的值发送变化时候b也会发生变化,浅拷贝和深拷贝一般出现在一个变量里有多个元素,有可变的元素和不可变的元素,比如若说a浅拷贝b,其中b可变元素变了,a也变了,b中不可变元素变了,a不会变,深拷贝则是,其中不管哪个元素变了后,两者互不影响受限。