字符串跟列表的恩怨、set集合、数据转换、深浅拷贝

一、补充基础数据类型的相关知识点:

  1、str.join() 把列表变成字符串

#1、字符串的插入
s = 'abc'
s1 =s.join("张无忌")
print(s1)    #张abc无abc忌

#把列表变成字符串 ---> 如果要把字符串变成列表,把字符串变成列表就进行切片slipt() a
= ["张无忌","周芷若","赵敏"] b = "_".join(a) print(b) #张无忌_周芷若_赵敏
#把字典变成字符串 a
= {"碧瑶":"赵丽颖","王源":"张小凡","陆雪琪":"杨紫"} b = "*".join(a) print(b) #碧瑶*王源*陆雪琪

  2、列表不能在循环的时候删除,因为索引会跟着改变

lis = ["张无忌","周芷若","赵敏","小昭"]
# lis.clear()  #一般使用clear可以清空列表,还可以使用其他方法
del_lis = []
for el in lis:               #lis在循环的时候不能删除,因为索引会变
    del_lis.append(el)       #记录要删除的内容
for el in del_lis:           #循环记录原来的内容
    lis.remove(el)           #删除原来的内容
print(lis)

---------------------------------------------------
例:
#删除姓周的人
lis = ["周星驰","周树人","张无忌","周芷若"]
del_lis = []
for el in lis:
    if el.startswith(""):
        del_lis.append(el)
for el in del_lis:
    lis.remove(el)
print(lis)

  3、字典也不能直接循环删除:(字典在循环的时候不能改变字典的大小)

      方法:要把删除的内容记录在列表中,循环列表,删除原列表,字典中的数据

#除了白子画,其他的都删除
dic = {"花千骨":"赵丽颖","白子画":"霍建华","杀阡陌":"马可"}
dic1 = {}
for k,v in dic.items():
    if "" in k:
       dic1[k] = v
dic = dic1
print(dic)


#删除字典
dic = {"紫薇":"林心如","小燕子":"赵薇","五阿哥":"苏有朋","皇阿玛":"张铁林","尔康":"周杰"}
lit = []
for el in dic:
lit.append(el) #将k添加新的列表中。
for el in lit:
dic.pop(el) #用字典删除k值。
print(dic)


  4、formkeys() 不会对原来的字典产生影响。产生新的字典

a = dict.fromkeys(["张三丰","张无忌","周芷若"]," 赵敏")
dic = {"a":"123"}
print(dic)
结果:{'a': '123'}   dict是一个类,dic是一个定义的变量 dic!=dict


s = dic.fromkeys("杨逍","金毛狮王")
print(s)
结果:{'': '金毛狮王', '': '金毛狮王'} #返回给一个新的字典

 二、set() 集合:

  1、特点:不重复,无序

  注意: set集合中的元素必须是可hash的, 但是set本⾝是不可hash得. set是可变的.

set1 = {'1','alex',2,True,[1,2,3]} # 报错
set2 = {'1','alex',2,True,{1:2}}  # 报错
set3 = {'1','alex',2,True,(1,2,[2,3,4])}  # 报错

#set中的元素是不重复的,且无序
s = {"张无忌","周芷若","周芷若"}
print(s)
#结果:{'周芷若', '张无忌'}

#使⽤用这个特性.我们可以使⽤用set来去掉重复
lis = ["赵丽颖","alex","张无忌","alex","赵丽颖"]
lis = set(lis)
print(lis)
#{'张无忌', 'alex', '赵丽颖'}

   2、set()的增删改查

1、增 
    add()
s = {"赵丽颖","张无忌","鹿晗"}
s.add("杨紫")
s.add("赵丽颖")  #如果有重复的,不会再添加进去
print(s)  #{'杨紫', '张无忌', '赵丽颖', '鹿晗'}

    update()
s = {"赵丽颖","张无忌","鹿晗"}
s.update("杨幂")
print(s)   #{'张无忌', '杨', '赵丽颖', '鹿晗', '幂'}   迭代更新

 
2、删 
      pop()
s = {"赵丽颖","张无忌","鹿晗"}
a = s.pop()  #随机删除
print(a)     #返回删除的值
print(s)
       
     remove()
s = {"赵丽颖","张无忌","鹿晗"}
s.remove("张无忌")   #删除指定的值
print(s)

    clear()
s = {"赵丽颖","张无忌","鹿晗"}
s.clear()      #清空set集合
print(s)

3、改  # set集合中的数据没有索引. 也没有办法去定位⼀个元素. 所以没有办法进行直接修改.我们可以采⽤先删除后添加的⽅式来完成修改操作 
s = {"赵丽颖","张无忌","鹿晗"}
s.remove("张无忌")
s.add("杨幂")
print(s)
#结果:{'杨幂', '赵丽颖', '鹿晗'}

4、查         # set是⼀个可迭代对象. 所以可以进⾏for循环
s = {"赵丽颖","张无忌","鹿晗"}
for el in s:
    print(el)

  3、set集合本⾝是可以发⽣改变的. 是不可hash的. 我们可以使⽤frozenset来保存数据. frozenset是不可变的. 也就是⼀个可哈希的数据类型

s = frozenset(["赵丽颖","张无忌","鹿晗"])  #冻结set,使set不可变
dic = {s:"123"}
print(dic)
#结果:{frozenset({'赵丽颖', '张无忌', '鹿晗'}): '123'}

三、数据类型的转换:

  想转成什么就用什么括起来

  元组 => 列表        list(tuple)

  列表 => 元组        tuple(list)

  list=>str    str.join(list)

  str=>list    str.split()

  转换成False的数据: 0,'',None,[],(),{},set() ==> False

四、深浅拷贝:

  1、直接赋值:两个变量指向同一个对象。

对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以. lst1的内存指向和lst2是⼀样的. lst1改变了, lst2也发生了改变
lst1 = ["赵丽颖","杨幂","鹿晗","古力娜扎"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("林心如")
print(lst1)
print(lst2)
#结果:['赵丽颖', '杨幂', '鹿晗', '古力娜扎']
           ['赵丽颖', '杨幂', '鹿晗', '古力娜扎']
           ['赵丽颖', '杨幂', '鹿晗', '古力娜扎', '林心如']
           ['赵丽颖', '杨幂', '鹿晗', '古力娜扎', '林心如']

dit1 = {"扶摇":"杨幂","无极太子":"阮经天"}
dit2 = dit1
print(dit1)
print(dit2)
dit2["轩辕岳"] = "赖艺"
print(dit1)
print(dit2)          
#结果:
{'扶摇': '杨幂', '无极太子': '阮经天'}
{'扶摇': '杨幂', '无极太子': '阮经天'}
{'扶摇': '杨幂', '无极太子': '阮经天', '轩辕岳': '赖艺'}
{'扶摇': '杨幂', '无极太子': '阮经天', '轩辕岳': '赖艺'}

  2、浅拷贝:只拷贝第一层内容。方法:copy()  、 [:]

lis = ["张无忌","周芷若","赵敏"]
lis1 = lis.copy()  #lis 和 lis1不是指向的同一个对象
# lis1 = lis[:]  #切片产生新的对象
lis.append("小昭")
print(lis)
print(lis1)
print(id(lis),id(lis1))

结果:
['张无忌', '周芷若', '赵敏', '小昭']
['张无忌', '周芷若', '赵敏']
2795577984520 2795577985224
#两个lst完全不不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉

lis = ["张无忌","周芷若","赵敏",["林心如","陈乔恩","董璇"]]
lis1 = lis.copy()
lis[3].append("朴信惠")
print(lis)
print(lis1)
print(id(lis),id(lis1))
结果:
['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇', '朴信惠']]
['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇', '朴信惠']]
1696216631496 1696216631624
#浅拷⻉. 只会拷⻉第⼀层. 第⼆层的内容不会拷⻉. 所以被称为浅拷贝

  3、深拷贝:对象中的所有内容都会被拷贝一份    导入模块import copy    方法:deepcopy()

import copy
lis = ["张无忌","周芷若","赵敏",["林心如","陈乔恩","董璇"]]
lis1 = copy.deepcopy(lis)
lis[3].append("宋慧乔")
print(lis)
print(lis1)
print(id(lis),id(lis1))
#结果:
['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇', '宋慧乔']]
['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇']
2041544733384 2041544734664

都不⼀样了.  深度拷⻉. 把元素内部的元素完全进行拷⻉复制. 不会产⽣⼀个改变另⼀个跟着改变的问题

补充⼀个知识点: 最后我们来看⼀个⾯试题

a = [1,2]
a[1] = a
print(a[1])
结果:
[1, [...]]

 

posted @ 2018-07-10 21:16  LW-5208  阅读(423)  评论(0编辑  收藏  举报