python中的set集合和深浅拷贝
一.基础数据类型的补充
1.str中的join算法,将列表转换成字符串,并用'_'(或其他)
1 li=['李嘉诚','马化腾','刘嘉玲','黄海峰',]
2 s='_'.join(li)
3 print(s) #李嘉诚_马化腾_刘嘉玲_黄海峰
2.循环删除列表中的每个元素
li=['李嘉诚','马化腾','刘嘉玲','黄海峰',]
for el in li:
li.remove(el)
print(li) #['马化腾', '黄海峰']
原因分析:for循环在运行过程中会有一个指针记录当前循环的元素是哪一个.
方法一:
1 li=['李嘉诚','马化腾','刘嘉玲','黄海峰',]
2 for i in range(0,len(li)):
3 li.pop() #括号中什么也不写,默认删除最后一个
4 print(li) #[]
方法二:删除元素会导致列表中元素的索引发生改变,所以容易出现问题.
1 li=['李嘉诚','马化腾','刘嘉玲','黄海峰',]
2 del_li=[]
3 for el in li:
4 del_li.append(el) #用另一个列表来记录我要删除的内容
5 for el in del_li: #循环另一个列表
6 li.remove(el) #把原列表中的每一个元素对应删除
7 print(li) #[]
字典也是如此:
1 dic = {"提莫":"冯提莫", "发姐":"陈一发儿", "55开":"卢本伟"}
2 lis=[]
3 for el in dic:
4 lis.append(el)
5 for el in lis:
6 dic.pop(el)
7 print(dic) #{}
3.dict中的元素在迭代的过程中是不允许进行删除的,要想删除,就要把想删除的元素暂时保存在一个list中,在循环list删除.
1 dic = {"提莫":"冯提莫", "发姐":"陈一发儿", "55开":"卢本伟"}
2 lis=[]
3 for el in dic:
4 if el.startswith('提'):
5 lis.append(el)
6 for el in lis:
7 dic.pop(el)
8 print(dic) #{'发姐': '陈一发儿', '55开': '卢本伟'}
4.dict中的dict.fromkeys(),可以帮助我们通过list创建一个dict
1 a','b'],['c','d'])
2 print(dic) #{'a': ['c', 'd'], 'b': ['c', 'd']} 前面的迭代被作为字典的键,后面的被作为字典的value
5.字符串和列表的相互转换
把字符串转换成列表:split()
把列表转换成字符串:join()
二.set集合
特点:set中的元素是无序的,不重复的,里面的元素必须是可hash的(int,str,tuple,bool),set就是字典类型的数据,但是不保存value.set用{}表示.
注意:set集合中的元素必须是可hash的,但是set本身是不可hash的.
不可重复,无序(一般用来去重):
1 s={'1','2','2'}
2 print(s) #第一次运行{'1', '2'} 第二次运行{'2', '1'}
1.增
(1) s.add():
1 s={'刘嘉玲','张曼玉','王祖贤'}
2 s.add('美丽的我')
3 s.add('王祖贤') #重复的内容不会添加到set中
4 print(s) #{'刘嘉玲', '美丽的我', '王祖贤', '张曼玉'}
(2) s.update():
1 s={'刘嘉玲','张曼玉','王祖贤'}
2 s.update('马化腾') #迭代添加
3 print(s) #{'化', '刘嘉玲', '张曼玉', '腾', '王祖贤', '马'}
2.删
(1) s.pop()
1 s={'刘嘉玲','张曼玉','王祖贤'}
2 # a=s.pop() #随机删除一个
3 # print(a)
4 # print(s)
(2) s.remove()
1 s={'刘嘉玲','张曼玉','王祖贤'}
2 # s.remove('刘嘉玲') #直接删除指定元素,如果不存在会报错
3 # print(s)
(3) s.clear()
1 s={'刘嘉玲','张曼玉','王祖贤'}
2 s.clear()
3 print(s) #set()
3.改
set中的数据没有索引,所以没有办法定位一个元素,因此没有办法进行直接修改.
我们可以采用先删除后添加的方式进行修改
#把刘嘉玲改成赵本山
s={'刘嘉玲','张曼玉','王祖贤'}
s.remove('刘嘉玲') #删除
s.add('赵本山') #添加
print(s) #{'赵本山', '张曼玉', '王祖贤'}
4.查
用for循环进行查看
1 s={'刘嘉玲','张曼玉','王祖贤'}
2 for el in s: #王祖贤
3 print(el) #刘嘉玲
4 #张曼玉
5.常用操作
1 s1={'刘能','赵四','皮长山'}
2 s2={'刘科长','冯科长','皮长山'}
3 print(s1 & s2) #交集
4 print(s1.intersection(s2)) #交集
5
6 print(s1 | s2) #并集
7 print(s1.union(s2)) #并集
8
9 print(s1 - s2) #差集
10 print(s1.difference(s2)) #差集
11
12 print(s1 ^ s2) #反差集
13 print(s1.symmetric_difference(s2)) #反差集
14
15 print(s1 < s2) #子集
16 print(s1.issubset(s2)) #子集
17
18 print(s1 > s2) #超集
19 print(s1.issuperset(s2)) #超集
三.深浅拷贝
1. 赋值. 没有创建新对象. 公用同一个对象
2. 浅拷贝. 拷贝第一层内容. [:]或copy()
1 lst1=['何炅','杜海涛','谢娜',['李维嘉']]
2 lst2=lst1.copy()
print(lst1) #2571062967176
print(lst2) #2571062967176
3 print(id(lst1[3])) #2449591204744 4 print(id(lst2[3])) #2449591204744
3. 深拷贝. 拷贝所有内容. 包括内部的所有.
1 import copy
2 lst1=['何炅','杜海涛','谢娜',['李维嘉']]
3 lst2=copy.deepcopy(lst1)
4 print(lst1)
5 print(lst2)
6 print(id(lst1),id(lst2)) #3135828524616 3135828628360
改变世界,改变自己!