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

 

 

 

posted @ 2018-08-03 15:49  ★行者尚★  阅读(210)  评论(0编辑  收藏  举报