set集合,深浅复制及一些常见知识点补充
set集合
一、无序的. 不重复的. 内容必须是可哈希的数据类型.
本身是不可哈希
添加:add(),update(),
删除:pop()
查询:可迭代对象需要可哈希的时候用frozenset()
dic = {"朱元璋":"明太祖", "朱棣":"明成祖", "朱元璋":"朱重八"}
dic['朱元璋'] = "和尚"
print(dic) #执行后朱元璋对应的值会被改成和尚
# set就是存储的key, set集合不会重复, 无序
s = {"朱元璋", "朱元璋", "朱棣"}
print(s) #执行完只会剩下一个朱元璋
s = {"alex", 1, True, {"你好"}}
s = {"马虎疼", [1,4,7]} # 不合法. [] 列表是不可哈希的
s = {"呵呵", "哈哈", "吼吼", (1, 4, 7)}
print(s)
前两个执行会报错因为其内部元素存在不可hash类型的,集合中元素必须是可哈希的。
#去重复
lst = [1,4,7,1,4,5,6,7,8,2,1,3,9]
s = set(lst)
lst = list(s)
print(lst)
执行结果会返回没有重复元素的列表
迭代更新
s = {"李谷一", "周润发", "邓丽君", "黄家驹", "张国荣"}
s.update("中岛美嘉") # 迭代更新
print(s)
返回结果会把"中岛美嘉"每个字迭代填充进这个集合中
若要将名字整体放进去需要将其放进列表中(如下)
s.update(["中岛美雪", "很牛B"])
print(s)
这样列表中两个字符串就会被填充进集合中
s1 = {"刘能", "赵四", "皮长山"}
s2 = {"刘科长", "冯乡长", "皮长山"}
求交集
print(s1 & s2)
print(s1.intersection(s2)) # 交集
# 并集
print(s1 | s2)
print(s1.union(s2)) # 并集
差集, 把自己本身中和对方不相关的内容留下
print(s2 - s1)
print(s2.difference(s1))
s1 = frozen(s) s1就会变成不可变、可哈希类型
index = 1
while index < 11:
index = index + 1
if index == 5:
break
print(index)
else:
print("哈哈哈")
print("呵呵")
该程序将会打印2 3 4 呵呵 需注意的是等式都是先计算等号右边的
二、list涉及到常见坑
lst = ["黄飞鸿", "霍元甲", "十三姨", "鬼脚七"]
s = "_*_".join(lst) # 把列表变成字符串. 用前面的字符串把列表的元素连接起来, 返回新字符串
print(s)
返回是列表中元素被前面元素连接起来的新的字符串:黄飞鸿_*_霍元甲_*_十三姨_*_鬼脚七
s = "金毛狮王"
s1 = "_".join(s) # 迭代把每一项进行拼接
print(s1) # 金毛狮王
返回的是金_毛_狮_王
list的删除有大坑需要注意,具体见下面解释:
lst = ["倚天屠龙记", "诛仙", "看见", "追风筝的人"]
for i in lst:
lst.remove(i)
print(lst)
返回结果会剩下诛仙跟追风筝的人,因为在for运行过程中会有一个指针来记录当前循环的元素是哪一个,一开始这个指针指向第0个并获取这个元素紧接着会删除这个元素,然后第一个元素会自动变成第0个然后指针向后移动一次指向诛仙,这时这个诛仙就会被自动滤过不被删除。
for i in range(0, len(lst)):
lst.pop()
print(lst) #这种能够满足要求,因为此时i是计算删除的次数且正好是被删列表的长度
下面这种方式是最合理、容易理解的删除方式
# 把要删除的东西保存在一个新列表中
new_lst = []
for el in lst:
new_lst.append(el)
# 循环新列表. 删除老列表
for e in new_lst:
lst.remove(e)
print(lst)# 把第一个参数中的每一项拿出来和第二个参数组成一个键值对
# 生成出来的键指向的value是同一个对象. 改变其中一个的时候. 另一个也会跟着改变
dic = dict.fromkeys(["jay", "jj"], ["周杰伦", "林俊杰"])
dic['jay'].append("蔡依林")
print(dic)
第一个dic其实生成的值右边这个字典{'jay': ['周杰伦', '林俊杰'], 'jj': ['周杰伦', '林俊杰']},第二项被当成一个值由前面两个键共享.
第二个dic生成两个值都包含"蔡依林"的字典
三、集合常见错误点及深浅复制
dict中的元素在迭代过程中是不允许被删除的
dic = {"a":'老A', 'b':"王宝强", 'c':"蓉姐", 'd':'百合姐'}
for k in dic:
if 'k' in k:
del dic[k]
print(dic)
这时会报错,因被删除的元素在迭代过程中。
要想删除需先将要删除的元素保存在一个列表中,然后循环该列表,再删除
dic = {"a":'老A', 'b':"王宝强", 'c':"蓉姐", 'd':'百合姐'}
dic_del_list = []
#删除key中带有'a'的元素
for k in dic:
if 'a' in k:
dic_del_list.append(k)
for el in dic_del_list:
del dic[el]
print(dic)
深浅复制:
deepcopy会将原来的对象完整复制给另一个对象