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
View Code
 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)
View Code
 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)
View Code

二.对之前的知识点进行补充

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
posted @ 2018-08-03 16:53  骑驴老神仙  阅读(313)  评论(0)    收藏  举报