【Python 格式化&列表 03】
一、格式化输出
- 用%s格式化输出
- 如果有两个需要输出的,必须用括号括起来,比如:%(name,traf)
- 如果只有一个需要输出,则直接在%后面跟即可,比如:%num
- 如果需要输出的两个值是同一个变量,那么这个变量必须要命名不同,否则的话会报错
- %s可以匹配任意字符,%d只能和数字匹配
#案例:用输入的name和tarffic替换“alex昨天开着特斯拉撞树上了”中的alex和特斯拉
name = input('请输入名称:') tarffic = input('请输入tarffic:') print('%s昨天开着%s撞树上了'%(name,tarffic)) #张三昨天开着拖拉机撞树上了
#案例二:只替换一个内容
num = input('请输入数字:') print('%s比1大吗?'%num)
#案例三:
passwd = input('passwd:') passwd = input('password:') print('%s是正确的吗?%s应该就是错误的'%passwd) #这种情况一定是错误的,所以应该passwd这两个变量必须是不同的 #正确如下: passwd1 = input('passwd:') passwd2 = input('password:') print('%s是正确的吗?%s应该就是错误的'%(passwd1,passwd2))
#案例四:
print('数字:%s'%'30') print('数字:%s'%30) print('数字:%s'%30.30) print('数字:%d'%21) print('数字:%d'%'30')
总结:匹配一个时直接在%后面跟变量,匹配多个时在%后面用括号括起来,括号内写变量
即:'%s其他%s其他%s其他'%(变量1,变量2,变量3) 注意:前面有几个%s后面就有几个变量,数量是对应的
二、编码
编码类型:ascii、gbk、unicode、utf8
UNICODE -->UTF8 'ABC'.encode('utf-8')
UNICODE <--UTF8 b'\xe6\xe8\xe7'.decode('utf-8')
三、列表
1、基础数据类型-列表
列表内可以放:整数,小数,字符串,布尔值等
1)已[]作为标识
list1 = ['aaa','222','bbb','ccc','ddd'] print(list1) print(list1[0]) #通过下标取值 print(list1[2])
2)切片 --->语法:列表名[start:end:step] step是步长 特点:顾头不顾尾 --》常用
如果前面不写,默认就是从0开始,如果后面不写,默认就是最后一个下标
# 取前两个数值 print(list1[0:2]) print(list1[:3]) #['aaa', '222', 'bbb'] print(list1[2:]) #['bbb', 'ccc', 'ddd']
3)列表除了有正的索引还有负的索引,负索引是从-1开始的
正数 0~n
负数 -1~m
print(list1[-1]) #ddd print(list1[-2])
4)切片,也可以从负索引进行切
print(list1[-3:-1:1]) #['bbb', 'ccc'] print(list1[-1:-3]) #[] # 这里可以看出切片是从左往右走的,所以[-1:-3]没有值,这里其实是省略了一个step:1, # 有了step以后切片时就是-3+1=-2,-2+1就=-1了,那么[-1:-3]想要有值只需要改变步骤即可[-1:-3:-1] # 所以-1-1=-2,-2-1就是-3了,所以list1[-1:-3:-1]) 值为['ddd', 'ccc'] print(list1[-1:-3:-1]) #['ddd', 'ccc']
5)反转列表 -->常用
print(list1[::-1]) #前后都不写,只在步骤那写一个-1,列表就可反转
6)隔一个取一个
print(list1[::2]) #['aaa', 'bbb', 'ddd'] 步长为2,所以实际切出来的列表就是[0,2,4] print(list1[1::3]) #['222', 'ddd'] -->切出来的就是第1、4个
7)列表的内存地址和列表拷贝
lst = ['111','222','333','444','555'] lst1= lst[:] lst2=lst.copy() print('lst内存地址:',id(lst)) #4482945408 print('lst1内存地址:',id(lst1)) #4481266048 print('lst2内存地址:',id(lst2)) #4482938048 print(lst==lst1) #true print(lst1==lst2) #true
从上面的结果可以看出来,lst,lst1,lst2内存地址是不同的,但是值都是相同
切片总结:
- 切片有步长,步长可以省略,顾头不顾尾额
- [start:end:step]
- [::] [:] 切列表全部
- [1:3] [1:] [:3] [1:7:2] 普通切片
- [::-1]反转
1.1、列表的增删改查
1)列表的新增 -->可以用关键字:append、insert
l=[1,2,3,4,5,'aaa',True,12.345] l.append('倪妮') print(l) l.insert(0,'赵丽颖') print(l) l.insert(5,'java') print(l)
执行结果:
[1, 2, 3, 4, 5, 'aaa', True, 12.345, '倪妮']
['赵丽颖', 1, 2, 3, 4, 5, 'aaa', True, 12.345, '倪妮']
['赵丽颖', 1, 2, 3, 4, 'java', 5, 'aaa', True, 12.345, '倪妮'
从上面可以看出,append只能在最后面增加,insert可以在任意位置增加,比如在下标5的位置增加Java,那么就直接写l.insert(5,'java')
一般情况下我们不要用insert操作,原因:
2)列表删除
- remove() :按索引删除
- pop():删除最后一个元素(常用),当然也可以按照索引删除
- clear():清空
- del list[index] 按索引删除
前两个常用
l.remove(2) #可以删除任意一个值 n=l.pop() #删除列表的最后一个值 print(n) #倪妮 m=l.pop() #永远删除的是列表的最后一个值 print(m) #12.345 k = l.pop(1) #也可以按照索引删除 l.clear() #清空列表 del l[2] #按照索引删除
3)列表修改
list[索引]=新的值
# 把aaa改成bbb a = 'bbb' l[5]=a num = 7+5 l[6]=num print(l)
#案例:一个列表放两个子列表,并且修改第一个列表的第二个元素
list_2=[1,'aaa',1.23] list_3=[2,'bbb',2.56] list_all=[] list_all.append(list_2) list_all.append(list_3) print(list_all) #[[1, 'aaa', 1.23], [2, 'bbb', 2.56]] # ------>修改第一个列表的第二个元素 list_new=list_all[0] list_new[1]='ccc' print(list_all) #[[1, 'ccc', 1.23], [2, 'bbb', 2.56]]
4)浅拷贝
list_4 = [1111,'yyyyyyyy',[1, 'ccc', 1.23], [2, 'bbb', 2.56]] list_5 = list_4[:] list_6 = list_4.copy() list_5.append('hello world') list_5[2].append('hello ketty') print(list_4) print(list_5) print(list_6) 执行结果 # [1111, 'yyyyyyyy', [1, 'ccc', 1.23, 'hello ketty'], [2, 'bbb', 2.56]] # [1111, 'yyyyyyyy', [1, 'ccc', 1.23, 'hello ketty'], [2, 'bbb', 2.56], 'hello world'] # [1111, 'yyyyyyyy', [1, 'ccc', 1.23, 'hello ketty'], [2, 'bbb', 2.56]]
列表list_4拷贝给list_5,如果list_5在末尾追加元素,则只会影响list_5,如果在list_5的子列表追加元素,则会影响所有关联的列表(4,5,6都会改变)
注意:list_5[2].append('hello ketty') 这个情况只能适用在列表套列表
---->如果不想让list_5新增的影响其他列表,采用下面的这种方式
import copy list_4 = [1111,'yyyyyyyy',[1, 'ccc', 1.23], [2, 'bbb', 2.56]] list_5 = list_4[:] list_6 = list_4.copy() list_7=copy.deepcopy(list_4) list_7[2].append('hello ketty') print(list_4) print(list_5) print(list_6) print(list_7) 执行结果: # [1111, 'yyyyyyyy', [1, 'ccc', 1.23], [2, 'bbb', 2.56]] # [1111, 'yyyyyyyy', [1, 'ccc', 1.23], [2, 'bbb', 2.56]] # [1111, 'yyyyyyyy', [1, 'ccc', 1.23], [2, 'bbb', 2.56]] # [1111, 'yyyyyyyy', [1, 'ccc', 1.23, 'hello ketty'], [2, 'bbb', 2.56]]
一般不建议用deepcopy
5)查找元素的索引
list_4 = [1111,'yyyyyyyy',[1, 'ccc', 1.23], [2, 'bbb', 2.56]] print(list_4.index(1111))
6)in/not in 在或者不在
list_4 = [1111,'yyyyyyyy',[1, 'ccc', 1.23], [2, 'bbb', 2.56]] print(1111 in list_4) #True print(2222 not in list_4) #True
# 练习题
# 循环5次
# 输入用户的名字,如果名字之前存在了,就提示已经存在
# 如果这个名字之前未存在,把这个名字添加到列表中
# 最后打印列表
n=0 list_1 = [] while n<5: name = input('请输入名称:') if name in list_1: print('%s已经存在'%name) else: list_1.append(name) n = n+1 print(list_1)
2、列表的其他操作
1)sort() 列表排序
2)len(list) 列表长度
l = [3,2,5,7,1,9,10,11,15,17] l.sort() print(l) print(len(l))
3)获取列表内的每一个元素
n=0 for n in l: print(n)
# 取列表中title的值
list1 = [{ 'c_id': '1060', 'id': '1060', 'course_id': '2313466', 'title': '2023升级版国家公务员录用考试专用教材行政职业能力测验历年真题及华图名师详解' }, { 'c_id': '1062', 'id': '1062', 'course_id': '2313467', 'title': '2023升级版国家公务员录用考试专用教材申论历年真题及华图名师详解' }, { 'c_id': '1036', 'id': '1036', 'course_id': '2313469', 'title': '2023升级版国家公务员录用考试专用教材申论同步测评' }] for i in list1: print(i['title'])
# 小练习
l = [['alex','222'],['wusir','666'],['周老板','123456']]
# 让用户输入用户名和密码
# 只要用户名和密码对上了l中的值,显示登陆成功
# 否则,显示登陆失败
name = input('name:') passwd = input('passwd:') for i in l: if name == i[0] and passwd == i[1]: print('%s登录成功'%name) break else: # 当for循环执行结束,并且在执行过程中没有被break,执行else中的代码 print('登录失败')
这种语法叫:for...else... --->由此可以推断出,for...break/continue/else
while循环也有 while...break/continue/else
for循环和while循环的区别:
for循环,循环一个固定的数据类型,while循环是根据一个条件进行的循环,所以while有可能死循环
#列表去重
list1=[1,2,2,4,5,5,6,1,11,10] lis2=[] for i in list1: if i not in lis2: lis2.append(i) print(lis2)