python基础基础数据类型-补充
发布于 2021-04-17 05:42 ,所属分类:知识学习综合资讯
目录
循环列表改变大小的问题
循环字典改变大小的问题
基础数据类型的转换
基础数据类型的分类
详解
循环列表,改变列表大小的问题
列表 li = [11, 22, 33, 44, 55]
把索引为奇数对应的元素删除
(不能一个一个删除,这个列表只是举个例子,里面的元素不不确定)。
正常思路:
(正向循环删除列表元素)
循环列表,然后进行判断,只要索引为奇数就删除。
li = [11, 22, 33, 44, 55]
for index in range(len(li)):
if index % 2 == 1:
li.pop(index)
print(li) # [11, 33, 44]
(左右滑动查看完整代码)
据题意,这个题最终的结果应该是:li = [11, 33, 55],但是得到的结果却是: li = [11, 33, 44]
第一次循环,index为0,原列表内容不删除;
第二次循环,index为1,将元素22删除(此时列表中33,44,55都会往前进一位,他们的索引由原来的2,3,4变成了1,2,3);
第三次循环,index为2,原列表内容不删除;
第四次循环,index为3,此时原列表索引为3的位置对应元素为55,将元素55删除;
第五次循环,index为4,原列表内容不删除。
正向循环一个列表时,如果删除某个元素,那么这个元素后面的所有元素都会向前进一位,他们的索引相比之前也会前进一位。
解决方式
1.直接删除
通过del()利用切片删除列表元素
li = [11, 22, 33, 44, 55]
del li[1::2]
print(li) # [11, 33, 55]
(左右滑动查看完整代码)
2.倒序删除
通过倒序循环删除列表元素
li = [11, 22, 33, 44, 55]
for index in range(len(li)-1, -1, -1):
if index % 2 == 1:
li.pop(index)
print(li) # [11, 33, 55]
(左右滑动查看完整代码)
第一次循环,index为4,原列表内容不删除;
第二次循环,index为3,将元素44删除(此时列表中33,44,55都会往前进一位,他们的索引由原来的2,3,4变成了1,2,3);
第三次循环,index为2,原列表内容不删除;
第四次循环,index为1,此时原列表索引为1的位置对应元素为22,将元素22删除;
第五次循环,index为0,原列表内容不删除。
倒序删除元素,每次删除元素,此元素后面的元素的索引虽然也发生变化,但是不会影响最终结果。
3.思维置换
把原列表索引为偶数的元素取出来放在一个新列表中,然后把新列表赋值给原列表
li = [11, 22, 33, 44, 55]
new_li = []
for index in range(len(li)):
if index % 2 == 0:
new_li.append(li[index])
li = new_li
print(li) # [11, 33, 55]
(左右滑动查看完整代码)
总结
在循环一个列表的过程中,最好不要改变列表的大小(增加值、删除值),如果要改变列表的大小,那么结果很可能会出错或者报错。
循环字典,改变字典大小的问题
字典dic = {'k1': 'pamela', 'k2': 'apple', 'k3': 'abc', 'age': 18}
将字典中键含有 'k' 元素的键值对删除
(不能一个一个删除,这个字典只是举个例子,里面的元素不确定)。
正常思路:
循环遍历所有的键,然后进行判断,只要键含有 'k' 元素就删除此键值对。
dic = {'k1': 'pamela', 'k2': 'apple', 'k3': 'abc', 'age': 18}
for key in dic:
if 'k' in key:
dic.pop(key)
print(dic) # RuntimeError: dictionary changed size during iteration
(左右滑动查看完整代码)
执行发现报错了,字典在循环时,只要改变大小,就会报错。
解决方式
1.直接删除
循环转换成列表的keys(),删除字典中的键值对
dic = {'k1': 'pamela', 'k2': 'apple', 'k3': 'abc', 'age': 18}
for key in list(dic.keys()):
if 'k' in key:
dic.pop(key)
print(dic) # {'age': 18}
(左右滑动查看完整代码)
2.思维置换
把字典中含有 'k' 元素的键取出来放在一个列表中,循环列表,删除字典中对应的键值对
dic = {'k1': 'pamela', 'k2': 'apple', 'k3': 'abc', 'age': 18}
li = []
for key in dic:
if 'k' in key:
li.append(key)
for i in li:
dic.pop(i)
print(dic) # {'age': 18}
(左右滑动查看完整代码)
总结
在循环一个字典的过程中,不要改变字典的大小(增加、删除字典的元素),如果要改变字典的大小,那么会直接报错。
基础数据类型的转换
基础数据类型有:int、bool、str、list、tuple、dict、set,这些数据类型之间都可以相互转换。
(点击查看大图)
int、bool、str 三者转换
'''int <---> bool'''
# int ---> bool
num1 = 100
print(bool(num1)) # True (非零即True)
num2 = 0
print(bool(num2)) # False (零即False)
# bool ---> int
t = True
print(int(t)) # 1 (True --> 1)
t = False
print(int(t)) # 0 (False --> 0)
(左右滑动查看完整代码)
'''int <---> str'''
# int ---> str
num = 100
print(str(num)) # '100'
# str ---> int # 全部由数字组成的字符串才可以转换成数字
s1 = '90'
print(int(s1)) # 90
(左右滑动查看完整代码)
'''str <---> bool'''
# str ---> bool
s1 = 'pamela'
print(bool(s1)) # True (非空即True)
s2 = ' ' # 有空格
print(bool(s2)) # True
s3 = '' # 空字符串
print(bool(s3)) # False (空即False)
# bool ---> str 无意义
t1 = True
print(str(True)) # 'True'
(左右滑动查看完整代码)
str、list 两者转换
'''str <---> list'''
# str ---> list
s1 = 'pamela 中文 apple'
print(s1.split()) # ['pamela', '中文', 'apple']
# list ---> str # list 里所有的元素必须是字符串类型才可以转换成字符串
l1 = ['pamela', '中文', 'apple']
print(' '.join(l1)) # 'pamela 中文 apple'
(左右滑动查看完整代码)
list、set 两者转换
'''list <---> set'''
# list ---> set 去重
l1 = [1, 2, 3, 3]
print(set(l1)) # {1, 2, 3}
# set ---> list
set1 = {1, 2, 3}
print(list(set1)) # [1, 2, 3]
(左右滑动查看完整代码)
str、bytes 两者转换
在计算机内存中,统一使用Unicode编码,当需要将数据保存到硬盘或者需要网络传输的时候,就转换为非Unicode编码,比如:UTF-8编码、GBK编码等。
bytes类型(python基础数据类型之一)也称作字节文本,主要用途就是网络的数据传输,与数据存储。bytes与str差不多,操作方法也很相似。
'''
str ---> bytes
encode 编码
(把Unicode编码转换成非Unicode编码)
'''
s1 = '中文'
b1 = s1.encode('utf-8') # 转化成utf-8的bytes类型
print(b1) # b'\xe4\xb8\xad\xe6\x96\x87'
b2 = s1.encode('gbk') # 转化成gbk的bytes类型
print(b2) # b'\xd6\xd0\xce\xc4'
(左右滑动查看完整代码)
'''
bytes ---> str
decode 解码
(把非Unicode编码转换成Unicode编码)
用什么方式编码就用什么方式解码,否则会报错
'''
b3 = b'\xe4\xb8\xad\xe6\x96\x87'
s3 = b3.decode('utf-8') # 解码 utf-8的bytes类型
print(s3) # '中文'
b4 = b'\xd6\xd0\xce\xc4'
s4 = b4.decode('gbk') # 解码 gbk的bytes类型
print(s4) # '中文'
(左右滑动查看完整代码)
'''
非Unicode编码之间相互转换
非Unicode编码先转换成Unicode编码,
再把Unicode编码转换成另一种非Unicode编码
例:gbk ---> utf-8
gbk先解码成Unicode,再编码成utf-8
'''
b1 = b'\xd6\xd0\xce\xc4' # gbk的'中文'
s1 = b1.decode('gbk') # 解码 转化成Unicode的'中文'
b2 = s1.encode('utf-8') # 编码 转化成utf-8的'中文'
print(b2) # b'\xe4\xb8\xad\xe6\x96\x87'
(左右滑动查看完整代码)
所有数据都可以转化成bool值
'''
转化成bool值为False的数据类型有:
'', 0, (), {}, [], set(), None
'''
基础数据类型的分类
(点击查看大图)
相关资源