set集合,深浅拷贝以及部分知识点补充
一.部分习题解析

1 # 1,老男孩好声音选秀大赛评委在打分的时候呢, 可以进行输入.
2 # 假设, 老男孩有10个评委. 让10个评委进行打分, 要求, 分数必须大于5分, ⼩于10分.
3 # count = 1
4 # while count <= 10:
5 # fen = int(input("请第%s号评委评分:" % count))
6 # if fen < 5 or fen > 10:
7 # print("是不是傻?")
8 # continue
9 # else:
10 # print("第%s位评委打分为:%s" %(count, fen) )
11 # count = count + 1

1 # 2. 电影投票. 程序先给出⼀个目前正在上映的电影列表. 由用户给每⼀个电影打分.
2 # 最终将该用户投票信息公布出来 lst = ['红楼梦', '解救吾先生', '美国往事', '西西里的美丽传说']
3 # 结果: {'红楼梦': 99, '解救吾先生': 80, '美国往事': 6, '西西里的美丽传说': 23}
4 # print('''正在上映的电影:
5 # 红楼梦
6 # 解救吾先生
7 # 美国往事
8 # 西西里的美丽传说''')
9
10 # lst = ['红楼梦', '解救吾先生', '美国往事', '西西里的美丽传说']
11 # dic = {}
12 # for el in lst:
13 # fen = input("请给%s电影打分" % el)
14 # dic[el] = fen
15 # print(dic)

1 # 4. 车牌区域划分, 现给出以下车牌. 根据车牌的信息, 分析出各省的车牌持有量.
2 # cars = ['鲁A32444','鲁B12333','京B8989M','黑C49678','黑C46555','沪B25041']
3 # locals = {'沪':'上海','黑':'黑龙江','鲁':'山东','鄂':'湖北','湘':'湖南','京':'北京'}
4 # result = {}
5 # for car in cars: # car 车牌子
6 # first_name = car[0]
7 # location = locals[first_name] # 山东
8 # # 进行统计
9 # if result.get(location) == None: # 如果获取当前位置. 找不到对应的车辆的数量
10 # result[location] = 1 # 第一辆车
11 # else:
12 # result[location] = result[location] + 1 # 第n量
13 # print(result)
二.对之前的知识点进行补充
1.str中的join方法,把列表转换成字符串
1 # 将列表转换成字符串. 每个元素之间用_拼接
2 # s = "**".join(["高华新", "刘清扬", "崔园樟"])
3 # print(s)
4 # 结果:高华新**刘清扬**崔园樟
5
6 # ss = "高华新**刘清扬**崔园樟"
7 # print(ss.split("**"))
8 # 结果:['高华新', '刘清扬', '崔园樟']
9
10 # 字符串转换成列表: split()
11 # 把列表转换成字符串: join()
12
13 # s = "_".join("马化腾")
14 # print(s)
15 # 结果:马_化_腾
16 # join(可迭代对象)
2.列表和字典在循环的时候不能直接删除,
需要把删除的内容记录在新的列表中,然
后循环新列表,删除字典或列表.
(1).删除不完整
原因:for的运行过程,会有一个指针来记录当前循环的元素是哪一个,一开始这个指针指向第0个,
然后获取到第0个元素,紧接着删除第0个这个时候,原来是第一个的元素会⾃动的变成第0个,
然后指针向后移动一次,指向1元素,这时原来的1已经变成了0,也就不会被删除.
(2).
1 # lst = ["紫云", "大云", "玉溪", "紫钻","a","b"]
2 # # lst.clear()
3 # new_lst = [] # 准备要删除的信息
4 # for el in lst: # 有一个变量来记录当前循环的位置
5 # new_lst.append(el)
6 #
7 # # 循环新列表, 删除老列表
8 # for el in new_lst:
9 # lst.remove(el)
10 #
11 # # 删除的时候, 发现. 剩余了一下内容. 原因是内部的索引在改变.
12 # # 需要把要删除的内容记录下来. 然后循环这个记录. 删除原来的列表
13 #
14 # print(lst)
15 # print(new_lst)
16
17 # lst = ["张国荣", '张铁林', '张国立', "张曼玉", "汪峰"]
18 # # 删掉姓张的
19 # # 记录姓张的.
20 # zhangs = []
21 # for el in lst:
22 # if el.startswith("张"):
23 # zhangs.append(el)
24 # for el in zhangs:
25 # lst.remove(el)
26 # print(lst)
27 # print(zhangs)
28
29 # 字典
30 # dic = {"提莫":"冯提莫", "发姐":"陈一发儿", "55开":"卢本伟"}
31 # # dic.clear()
32 # lst = []
33 # for k in dic:
34 # lst.append(k)
35 #
36 # for el in lst:
37 # dic.pop(el)
38 # print(dic)
注意:由于删除元素会导致元素的索引改变,所以容易出现问题,尽量不要再循环中直接去删除元素,
可以把要删除的元素添加到另一个集合中然后再批量删除
综上所述:列表和字典都不能再循环的时候进行删除. 字典再循环的时候不允许改变大小
3. fromkeys()
(1).返回新字典,对原字典没有影响
(2).后面的value,是多个key共享的value
1 # dic = {"apple":"苹果", "banana":"香蕉"}
2 # 返回新字典. 和原来的没关系
3 # ret = dic.fromkeys("orange", "橘子") # 直接用字典去访问fromkeys不会对字典产生影响
4 # print(ret)
5 # 结果:{'o': '橘子', 'r': '橘子', 'a': '橘子', 'n': '橘子', 'g': '橘子', 'e': '橘子'}
6
7 # ret = dict.fromkeys("abc",["哈哈","呵呵", "吼吼"]) # fromkeys直
8 # 接使用类名进行访问
9 # print(ret)
10 # 结果:{'a': ['哈哈', '呵呵', '吼吼'], 'b': ['哈哈', '呵呵', '吼吼'], 'c': ['哈
11 # 哈', '呵呵', '吼吼']}
12
13 # a = ["哈哈","呵呵", "吼吼"]
14 # ret = dict.fromkeys("abc", a) # fromkeys直接使用类名进行访问
15 # a.append("嘻嘻")
16 # print(ret)
17 # 结果:{'a': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'b': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'c': ['哈哈', '呵呵', '吼吼', '嘻嘻']}
4.类型转换
元祖 => 列表 list( tuple)
列表 => 元祖 tuple(list)
list => str str.join(list)
str => list str.split()
转换成False的数据:
0,'',None,[],{},set() => False
三.set集合
特点:
无序,不重复,元素必须可哈希(不可变)
作用:
去重复(最重要的)
(1).本身是可变的数据类型,有增删改查操作.
增加:
1 # s = {"刘嘉玲", '关之琳', "王祖贤"}
2 # s.add("郑裕玲")
3 # print(s)
4 # s.add("郑裕玲") # 重复的内容不不会被添加到set集合中
5 # print(s)
6
7 # s = {"刘嘉玲", '关之琳', "王祖贤"}
8 # s.update("麻花藤") # 迭代更更新
9 # print(s)
10
11 # s.update(["张曼⽟", "李若彤","李若彤"])
12 # print(s)
删除:
# s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
# item = s.pop() # 随机弹出⼀一个.
# print(s)
# print(item)
# s.remove("关之琳") # 直接删除元素
# s.remove("马虎疼") # 不存在这个元素. 删除会报错
# print(s)
# s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是
# # set() 因为要和 dict区分的.
# print(s) # set()
修改:
1 # set集合中的数据没有索引. 也没有办法去定位一个元素. 所以没有办法进
2 # 行直接修改.
3 # 我们可以采用先删除后添加的方式来完成修改操作
4 # s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
5 # 把刘嘉玲改成赵本山
6 # s.remove("刘嘉玲")
7 # s.add("赵本山")
8 # print(s)
常用操作:
1 # s1 = {"刘能", "赵四", "皮长山"}
2 # s2 = {"刘科长", "冯乡长", "皮长山"}
3 #
4 # # 交集
5 # # 两个集合中的共有元素
6 # print(s1 & s2) # {'⽪⻓⼭'}
7 # print(s1.intersection(s2)) # {'皮长山'}
8 #
9 # # 并集
10 # print(s1 | s2) # {'刘科长', '冯乡长', '赵四', '皮长山', '刘能'}
11 # print(s1.union(s2)) # {'刘科长', '冯乡长', '赵四', '皮长山', '刘能'}
12 #
13 # # 差集
14 # print(s1 - s2) # {'赵四','刘能'} 得到第一个中单独存在的
15 # print(s1.difference(s2)) # {'赵四','刘能'}
16 #
17 # # 反交集
18 # print(s1 ^ s2) # 两个集合中单独存在的数据 {'冯乡长', '刘能', '刘科长', '赵四'}
19 # print(s1.symmetric_difference(s2)) # {'冯乡长', '刘能', '刘科长', '赵四'}
20 #
21 # s1 = {"刘能", "赵四"}
22 # s2 = {"刘能", "赵四", "⽪长⼭"}
23 #
24 # # 子集
25 # print(s1 < s2) # set1是set2的子集吗? True
26 # print(s1.issubset(s2))
27 #
28 # # 超集
29 # print(s1 > s2) # set1是set2的超集吗? False
30 # print(s1.issuperset(s2))
(2).frozenset()冻结的集合,不可变的,可哈希的(不常用,只做了解)
# s = frozenset(["赵本山", "刘能", "皮长山", "长跪"])
# dic = {s:'123'} # 可以正常使用了了
# print(dic)
四.深浅拷贝(copy,难点)( import copy:引入copy模块)
1.赋值:没有创新对象,公用同一个对象
1 # lst1 = ["金毛狮王", "紫衫龙王", "白眉鹰王", "青翼蝠王"]
2 # lst2 = lst1
3 # print(lst1)
4 # print(lst2)
5 #
6 # lst1.append("杨逍")
7 # print(lst1)
8 # print(lst2)
9 # 结果:
10 # ['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨逍']
11 # ['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨逍']
2.浅拷贝:拷贝第一层的内容,[:]或copy()
1 # lst1 = ["何炅", "杜海涛","周渝民"]
2 # lst2 = lst1.copy()
3 # lst1.append("李嘉诚")
4 # print(lst1)
5 # print(lst2)
6 # print(id(lst1), id(lst2))
7 # 结果:
8 # 两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷贝
9 #
10 # lst1 = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]]
11 # lst2 = lst1.copy()
12 # lst1[3].append("无敌是多磨寂寞")
13 # print(lst1)
14 # print(lst2)
15 # print(id(lst1[3]), id(lst2[3]))
16 #
17 # 结果:
18 # ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']]
19 # ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']]
20 # 4417248328 4417248328
3.深拷贝:拷贝所有内容,包括内部的所有,引入copy模块, deepcopy()
1 # lst1 = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]]
2 # lst2 = copy.deepcopy(lst1)
3 # lst1[3].append("⽆无敌是多磨寂寞")
4 # print(lst1)
5 # print(lst2)
6 # print(id(lst1[3]), id(lst2[3]))
7 # 结果:
8 # ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']]
9 # ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅']]
10 # 4447221448 4447233800