python之数据类型类型的补充、集合、深浅copy
<1> 编码encode 解码decode
s1='太白' b1=s1.encode('gbk') print(b1) #b'\xcc\xab\xb0\xd7' s2=b1.decode('gbk') b2=s2.encode('utf-8') print(b2) #b'\xe5\xa4\xaa\xe7\x99\xbd'
<2>下面的代码可以成立:因为utf-8,gbk,unicode等编码的英文字母,数字,特殊字符都是映射的ascii码
s1='alex' b1=s1.encode('gbk') s2=b1.decode('utf-8') print(s2) #alex
1.基础数据类型补充内容
(1)str 字符串 补充内容练习一遍即可 *
1) capitablize 首字母大写,其余小写
s1='taiBAI' print(s1.capitalize()) #Taibai 首字母大写,其余小写
2) swapcase 大小写翻转
print(s1.swapcase()) #TAIbai msg='taibai say hi' print(msg.title()) #每个单词的首字母大写 Taibai Say Hi
3)center 居中
s1='barry' print(s1.center(20,'*')) #*******barry********
4) find 通过元素找索引,找到第一个就返回,找不到就返回-1
index 通过元素找索引,找到第一个就返回,找不到就报错
s1='barrya' print(s1.find('a')) #1 print(s1.index('o')) #报错
(2)tuple 元组 练习一遍即可 *
元组中如果只有一个元素,并且没有逗号,那么他不是元组,他与该元素的数据类型一致。***
1)元组的各种类型
tu1=(2,3,4)
tu2=(2,)
tu3=(2)
tu4=('太白')
tu5=([1,2,3])
print(tu1,type(tu1)) #(2, 3, 4) <class 'tuple'>
print(tu2,type(tu2)) #(2,) <class 'tuple'>
print(tu3,type(tu3)) #2 <class 'int'>
print(tu4,type(tu4)) #太白 <class 'str'>
print(tu5,type(tu5)) #[1, 2, 3] <class 'list'>
2)count 计数 * 练习一遍即可
tu=(1,2,3,3,3,2,2,3,) print(tu.count(3)) #4
3)index 索引 * 练习一遍即可
tu=('太白','小甲鱼','太白')
print(tu.index('太白')) #0
(3)list 列表
l1=['太白','123','女神','大壮']
1) count 计数
print(l1.count('大壮'))#1
2) index 索引
print(l1.index('大壮')) #3
3)sort 排序
l2=[5,4,3,7,8,9,1,6] l2.sort() print(l2) #[1, 3, 4, 5, 6, 7, 8, 9] 从小到大 l2.sort(reverse=True) print(l2) #[9, 8, 7, 6, 5, 4, 3, 1] 从大到小 l2.reverse() print(l2) #[6, 1, 9, 8, 7, 3, 4, 5] 翻转
4)列表可以相加
l1=[1,2,3] l2=['太白','123','女神'] print(l1+l2) #[1, 2, 3, '太白', '123', '女神']
5)列表与数字相乘
l1=[1,2,3] l2=l1*3 print(l2) #[1, 2, 3, 1, 2, 3, 1, 2, 3]
6)有列表l1, l1 = [11, 22, 33, 44, 55],请把索引
为奇数对应的元素删除(不能一个一个删除,此l1只是举个例子,里面的元素不定)。
l1 = [11, 22, 33, 44, 55]
方法一
del l1[1::2] print(l1) #[11, 33, 55]
方法二:倒序法删除元素 ****
for index in range(len(l1)-1,-1,-1):
if index%2==1:
l1.pop(index)
print(l1) #[11, 33, 55]
方法三:思维置换
new_l1=[]
for index in range(len(l1)):
if index%2==0:
new_l1.append(l1[index])
l1=new_l1
print(l1) #[11, 33, 55]
在循环一个列表时的过程中,如果你要改变列表的大小(增加值,或者删除值),那么结果很可能会出错或者报错。
(4)字典的补充
1)update 更新 ***
dic = {'name': '太白', 'age': 18}
dic.update(hobby='运到',hight='175')
print(dic) #{'name': '太白', 'age': 18, 'hobby': '运到', 'hight': '175'}
dic = {'name': '太白', 'age': 18}
dic.update(name='太白金星')
print(dic) #{'name': '太白金星', 'age': 18}
dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')])
print(dic) #{'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'}
dic1 = {"name":"jin","age":18,"sex":"male"}
dic2 = {"name":"alex","weight":75}
dic1.update(dic2) #更新,有则覆盖,无则增加
print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75}
print(dic2) # {'name': 'alex', 'weight': 75}
2)fromkeys 字典的创建
dic=dict.fromkeys('abc',1000)
print(dic) #{'a': 1000, 'b': 1000, 'c': 1000}
dic=dict.fromkeys([1,2,3],'alex')
print(dic) #{1: 'alex', 2: 'alex', 3: 'alex'}
3)这里有一个坑,值共有一个
dic=dict.fromkeys([1,2,3],[])
dic[1].append(666)
print(dic) #{1: [666], 2: [666], 3: [666]}
思考题:
dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18}
#请将字典中所有键带k元素的键值对删除
# for key in range(len(dic)):
# if 'k' in key:
# dic.pop(key)
# print(dic) #报错
#在循环一个字典的过程中,不要改变字典的大小(增,删字典的元素),否则会直接报错。
方法1
l1=[]
for key in dic:
if 'k' in key:
l1.append(key)
for i in l1:
dic.pop(i)
print(dic)
方法2
for key in list(dic.keys()): #['k1','k2','k3','age']
if 'k' in key:
dic.pop(key)
print(dic)
(5)数据类型之间的转换
'''
int str bool
str<-->bytes
str<-->list
dict.keys() dict.values() dict.items
tuple<-->list
dict-->list
'''
str---->list
s1='alex wusir taibai'
l1=s1.split()
print(l1) #['alex', 'wusir', 'taibai']
list--->str 此list中的元素全部是str类型
l1=['alex', 'wusir', 'taibai']
s2=' '.join(l1)
print(s2) #alex wusir taibai
tuple--->list
l1=[1,2,3]
tu1=tuple(l1)
print(tu1) #(1, 2, 3)
list--->tuple
tu2=(0,1,2)
l1=list(tu2)
print(l1) # [0, 1, 2]
dict-->list
dic1={'name':'alex','age':1000}
l1=list(dic1)
print(l1) #['name', 'age']
所有数据都可以转化成bool值
转化成bool值为False的数据类型有:
'', 0, (), {}, [], set(), None
2、集合
1.集合set
(1)定义set:
{'wusir','alex',1,2,3}
集合要求里面的元素必须是不可变的数据类型,但是集合本身是可变的数据类型。
集合里面的元素不重复(天然的去重),无序的。
(2)作用:
去重;关系测试
set1={'alex',[1,2],1,2,3}#错误的集合类型[1,2]为可变的数据类型
(3)集合的类型
类型一:
set2={'alex','wusir'}
print(set2) #{'alex', 'wusir'}
类型二:
set3=set({'alex','wusir'})
print(set3) #{'wusir', 'alex'}
list去重 面试必考 ***
l1=[1,1,2,3,4,4,3,2,1,5,5]
set1=set(l1)
l2=list(set1)
print(l2) #[1, 2, 3, 4, 5]
(4)集合的增删查
set1={'alex','wusir','ritian','egon','barry'}
1)增 集合的增是增加在随机的位置
add
set1.add('女神')
print(set1) #{'barry', 'alex', 'wusir', 'ritian', 'egon', '女神'}
update
set1.update('abc')
print(set1) #{'alex', 'barry', '女神', 'egon', 'a', 'b', 'c', 'wusir', 'ritian'}
2)删除
remove 指定删除元素
set1.remove('alex')
print(set1) #{'ritian', 'wusir', 'barry', 'egon'}
pop 无序删除
set1.pop() #无序删除
print(set1) #{'ritian', 'wusir', 'alex', 'egon'}
clear 清空集合
set1.clear() print(set1) #set()
del 删除整个集合,彻底删除
del set1 print(set1) #报错,没了
3)查
只能用for 去查
2.集合的交集并集差集
set1={1,2,3,4,5}
set2={4,5,6,7,8}
(1)交集
print(set1 & set2) #{4, 5}
print(set1.intersection(set2)) #{4, 5}
(2)并集
print(set1 | set2) #{1, 2, 3, 4, 5, 6, 7, 8}
print(set1.union(set2)) #{1, 2, 3, 4, 5, 6, 7, 8}
(3)反交集 ^
print(set1 ^ set2) #{1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2)) ##{1, 2, 3, 6, 7, 8}
(4)差集
print(set1-set2) #{1, 2, 3}
print(set1.difference(set2)) #{1, 2, 3}
(5)子集
set1={1,2,3}
set2={1,2,3,4,5}
print(set1<set2) #True
print(set1.issubset(set2)) #True
(6)超集
print(set2>set1) ##True print(set2.issuperset(set1)) #True
set1=(1,2,3)
set3=frozenset(set1)
print(set3) #frozenset({1, 2, 3}) 不可变的数据类型 ***
#赋值运算
l1=[1,2,3] l2=l1 l1.append(666) print(l2) #[1, 2, 3, 666] print(id(l1)) #2207667794760 print(id(l2)) ##2207667794760
3、浅拷贝
案例一:
l1=[1,2,3] l2=l1.copy() l1.append(666) print(l1,l2) #[1, 2, 3, 666] [1, 2, 3]
案例二:
l1=[1,2,3,[22,]] l2=l1.copy() l1.append(666) print(l1,l2) #[1, 2, 3, [22], 666] [1, 2, 3, [22]]
案例三:
l1=[1,2,3,[22,]]
l2=l1.copy()
l1[-1].append('taibai')
print(l1,l2) #[1, 2, 3, [22, 'taibai']] [1, 2, 3, [22, 'taibai']]
print(id(l1),id(l2)) #2022479746696 2022479745864
print(id(l1[-1]),id(l2[-1])) #2022479746696 2022479745864
结论:对于浅copy来说,只是在内存中重新创建了开辟了一个空间存放一个新列表,
但是新列表中的元素与原列表中的元素是公用的。
4.深拷贝
import copy #引用第三方库
l1=[1,2,3,[22,]]
l2=copy.deepcopy(l1) #此copy为第三方库里面的copy模块
print(l1,l2) #[1, 2, 3, [22]] [1, 2, 3, [22]]
# l1.append(666)
# print(l2) #[1, 2, 3, [22]]
l1[-1].append('太白')
print(l2) #[1, 2, 3, [22]]
应用场景:
(1)完全独立的copy一份数据,与原数据没有关系,深copy
(2)如果一份数据(列表)第二层,你想与原数据进行公用,浅copy
#面试题 切片属于浅copy
l1 = [1, 2, 3, 4, ['alex']] l2 = l1[::] # l1.append(666) # print(l2) #[1, 2, 3, 4, ['alex']] 深copy l1[-1].append(666) print(l2) #[1, 2, 3, 4, ['alex', 666]] 浅copy

浙公网安备 33010602011771号