一、基础数据类型补充
str.join() : 把列表变成字符串,遍历列表,依次把str插入到遍历的列表值末尾中,组成一个新的字符串
1 b = "&" 2 c = b.join(['gailun', 'zhaoxin', 'huangzi', 'manzi', 'jiansheng']) 3 print(c)
>>>>>>>>> gailun&zhaoxin&huangzi&manzi&jiansheng
列表在循环的时候不能被删除,因为索引会被改变
1 lst = ['that girl', 'firs', 'smile of her', 'my dream'] 2 for i in lst: 3 lst.remove(i) 4 print(lst)
>>>>>>>>>['firs', 'my dream']
结果显示列表并没有被删除干净,是因为列表循环时,指针会第一个指向索引为0的元素,当索引为0的元素被删除后,索引为1的元素会自动向前进一步,索引变成0,而指针再次寻找时,会指向索引为1的元素,所以原先索引为1的元素会被漏掉,从而导致列表删不干净
1 lst = ['that girl', 'firs', 'smile of her', 'my dream'] 2 lst1 = [] 3 for i in lst: 4 lst1.append(i) 5 for i in lst1: 6 lst.remove(i) 7 print(lst)
>>>>>>>>>> [ ]
用一个新列表来记录原列表元素,然后循环新列表来删除原列表的元素 也可以用一下方法来循环删除元素
1 li = ['abc', 'bcd', 'cde', 'edf'] 2 for i in range(0, len(li)): # 循环len(li)次, 然后从后往前删除 3 li.pop() 4 print(li)
>>>>>>>>>> [ ]
注意: 由于删除元素会导致元素的索引改变, 所以容易出现问题. 尽量不要再循环中直接去删 除元素. 可以把要删除的元素添加到另一个集合中然后再批量删除.
字典也不能在循环的时候更改大小,如果想要删除字典中的元素,需要使用一个列表来记录要删除的元素,然后遍历列表来删除字典中的元素
1 dic = {'yang': 25, 'pan': 24, 'liu': 21} 2 lst =[] 3 for k in dic: 4 lst.append(k) 5 for i in lst: 6 del dic[i] 7 print(dic)
>>>>>>>>>> { }
fromkeys() : 可以通过列表来创建一个字典
1 s = dict.fromkeys(['林俊杰', '陈奕迅', '周杰伦', '黄家驹'], 'shuai') 2 print(s)
>>>>>>>>> {'林俊杰': 'shuai', '陈奕迅': 'shuai', '周杰伦': 'shuai', '黄家驹': 'shuai'}
也可以通过字典的对象来创建
1 dic = {} 2 s = dic.fromkeys(['林俊杰', '陈奕迅', '周杰伦', '黄家驹'], 'shuai') 3 print(s)
>>>>>>>>> {'林俊杰': 'shuai', '陈奕迅': 'shuai', '周杰伦': 'shuai', '黄家驹': 'shuai'}
二、set集合
集合的特点: 不重复,无序的,用{ }表示
注意: set集合中的元素必须是可hash的, 但是set本身是不可hash得. set是可变的.
使用set的不重复特性来为列表去重
1 lst = ['影流之主', '疾风剑豪', '诡术妖姬', '放逐之刃', '放逐之刃', '疾风剑豪', '卡牌大师'] 2 s = set(lst) 3 lst = list(s) 4 print(lst)
>>>>>>>>>>> ['卡牌大师', '放逐之刃', '疾风剑豪', '诡术妖姬', '影流之主']
集合的增删改查:
增 :
add() : # 重复的内容不会被添加进去
update() : 迭代添加
1 s = {'疾风剑豪', '影流之主', '诡术妖姬', '卡特琳娜', '卡牌大师', '九尾妖狐', '光辉女郎'} 2 s.add('刀锋之影') 3 print(s)
>>>>>>>>>> {'卡特琳娜', '疾风剑豪', '光辉女郎', '诡术妖姬', '影流之主', '刀锋之影', '卡牌大师', '九尾妖狐'}
1 s = {'疾风剑豪', '影流之主', '诡术妖姬', '卡特琳娜', '卡牌大师', '九尾妖狐', '光辉女郎'} 2 s.update('刀锋之影') 3 print(s)
>>>>>>>>>> {'刀', '卡牌大师', '卡特琳娜', '疾风剑豪', '锋', '之', '光辉女郎', '影流之主', '九尾妖狐', '诡术妖姬', '影'}
删 :
pop() : 随机删除一个
remove() : 指定元素删除,如果指定的 元素不存在,则会报错
clear() : 清空集合
1 s = {"刘嘉玲", '关之琳', "王祖贤", "张曼玉", "李若彤"} 2 item = s.pop() # 随机弹出⼀一个. 3 print(s) 4 print(item) 5 6 7 s.remove("关之琳") # 直接删除元素 # 8 s.remove("马虎疼") # 不不存在这个元素. 删除会报错 9 print(s) 10 11 12 s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和 dict区分的. 13 print(s) # set()
改 :
集合不能修改
查 :
for 循环迭代
集合常用操作:
交集:
1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'} 2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'} 3 print(lst & lst1)
# 4 print(lst.intersection(lst1))
>>>>>>>>> {'林俊杰'}
并集:
1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'} 2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'} 3 print(lst | lst1) 4 # print(lst.union(lst1))
>>>>>>>>>> {'黄家驹', '周杰伦', '毛不易', '周润发', '陈奕迅', '周树人', '周星星', '林俊杰', '薛之谦'}
差集:
1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'} 2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'} 3 print(lst - lst1) 4 # print(lst.difference(lst1))
>>>>>>>>> {'毛不易', '陈奕迅', '薛之谦', '黄家驹'}
反交集:
1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'} 2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'} 3 print(lst ^ lst1) 4 # print(lst.symmetric_difference(lst1))
>>>>>>>>> {'周杰伦', '陈奕迅', '毛不易', '周润发', '黄家驹', '薛之谦', '周树人', '周星星'}
子集:
1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'} 2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'} 3 print(lst < lst1) 4 # print(lst.issubset(lst1))
>>>>>>>>> False
超集:
1 lst = {'林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'} 2 lst1 = {'周杰伦', '周星星', '周润发', '周树人', '林俊杰'} 3 print(lst > lst1) 4 # print(lst.issuperset(lst1))
>>>>>>>>> False
三、深浅拷贝
赋值操作:
1 lst = ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易'] 2 lst1 = lst 3 lst1.append('周杰伦') 4 print(lst) 5 print(lst1)
>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', '周杰伦']
>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', '周杰伦']
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以. lst的内存指向和lst1是一样的. lst1改变了, lst也发生了改变
浅拷贝:
1 lst = ['yasuo', 'xiazi', 'yingliu'] 2 lst1 = lst.copy() 3 # lst1 = lst[:] # 切片也是复制 4 lst.append('shitouren') 5 lst1.append('jiqiren') 6 print(lst) 7 print(lst1)
>>>>>>>>>>>> ['yasuo', 'xiazi', 'yingliu', 'shitouren']
>>>>>>>>>>>> ['yasuo', 'xiazi', 'yingliu', 'jiqiren']
两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷贝,浅拷贝只能实现第一层的拷贝
深拷贝:
1 import copy 2 3 lst = ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', ['田馥甄', 'jc', '于文文']] 4 lst1 = copy.deepcopy(lst) 5 lst[5].append('杨钰莹') 6 print(lst) 7 print(lst1)
>>>>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', ['田馥甄', 'jc', '于文文', '杨钰莹']]
>>>>>>>>>>>>>> ['林俊杰', '陈奕迅', '黄家驹', '薛之谦', '毛不易', ['田馥甄', 'jc', '于文文']]
深度拷贝. 把元素内部的元素完全进行拷贝复制. 不会产生一个改变另一个跟着改变的问题