python列表和字符串
day07
01-列表
列表的遍历
list1 = ['阿甘正传', '海王', '阿凡达', '霸王别姬', '憨豆特工', '红海行动']
1.直接遍历
for i in list1:
print(i)
2.间接遍历
len():能够查看容器中元素个数(返回容器的长度)
print(len(list1))
for j in range(len(list1)):
print(f'下标{j}对应元素{list1[j]}')
列表的拼接和重复
list1 = ['阿甘正传', '海王', '阿凡达', '霸王别姬', '憨豆特工', '红海行动']
# 列表的拼接和重复
list2 = ['战狼']
# 拼接
print(list1 + list2)
# 返回:['阿甘正传', '海王', '阿凡达', '霸王别姬', '憨豆特工', '红海行动', '战狼']
# 重复
print(list2 * 5)
# 返回:['战狼', '战狼', '战狼', '战狼', '战狼']
# 列表性质补充:列表中可以出现重复元素
列表是可修改的(增删改)
games = []
# 增加
# opend():向列表中追加元素
games.append('LOL')
games.append('DNF')
print(games)
# insert:向列表中插入元素
games.insert(1, 'PUBG')
print(games)
# 修改
# 容器[下标] = 新的值
games[1] = 'APEX'
print(games)
# 删除
# del:根据指定下标删除元素
del games[1]
print(games)
# remove():删除指定元素
games.remove('DNF')
print(games)
# pop():根据下标删除元素,使用pop删除的元素还能被找回
content = games.pop(0)
print(content, games)
# clear():直接清空列表
list1.clear()
print(list1)
执行结果
以上列表的增删改操作都是建立在games这个列表自身基础上的
删除操作:del、remove、clear等于电脑中直接删除文件,而pop等于将文件删除时放入回收站,还可以再次恢复
02-列表的相关方法
1. index:从列表中查找指定元素的下标,只要找到元素直接停止查找,还可以指定开始查找的位置
list1 = [1, 2, 3, 4, 5, 6, 7, 5]
result = list1.index(5)
print(result)
# 可以指定开始查找的位置(从下标为6的位置开始查找5)
result1 = list1.index(5, 6)
print(result1)
# 如果index找不到元素报错会直接停止整个元素
2.sort:将列表从小到大排序,sort方法修改的是列表本身
list1.sort()
print(list1)
# 添加参数reverse=True,就可以从大到小排序
list1.sort(reverse=True)
print(list1)
3.sorted:将列表从小到大排序,sorted方法不会修改列表本身
list2 = [1, 3, 5, 7]
print(sorted(list2, reverse=True), list2)
4.reverse:能够将列表倒序,reverse修改的是列表本身
list3 = [1, 2, 3, 4, 5]
list3.reverse()
print(list3)
5.extend:能够将容器中的元素全部添加到列表中
list4 = []
list4.append(list3)
list4.extend(list3)
list4.extend(range(0, 9, 2))
print(list4)
6.count:计数,统计列表中某个元素的出现次数
print(list4.count(2))
7.sum:针对于数字列表(列表中全都是数字的列表)求和
print(sum(list3))
8.max、min:查看列表中的最大值、最小值
print(max(list3))
print(min(list3))
9.一些练习题
# 练习1:写程序实现类似于index的功能,找到元素直接停止查找
content = input('请输入要找的元素:')
place = int(input('请输入你需要从哪个位置开始查找:'))
list5 = ['a', 'b', 'c', 'd', 'a']
for i in range(place, len(list5)):
if list5[i] == content:
print(f'{content}在列表中的位置为{i}')
break
# 练习2:实现extend的功能,将range(1, 101)放到list6中
list6 = [1, 2, 3]
for i in range(1, 101):
list6.append(i)
print(list6)
# 练习3:实现sum的功能
total = 0
for i in list6:
total += i
print(total)
# 练习4:实现max的功能
max = list6[0]
for i in list6[1:]:
if max <= i:
max = i
print(max)
day08
01-列表的比较大小
1.列表比较大小比较的是列表中元素的大小
2.列表中参与比较大小的元素位置是一一对应的
3.从第一对元素开始比较,直到分出大小;否则两个列表相等
4.比较大小的元素必须是相同数据类型
# 列表比较大小
list1 = [1, 2, 3]
list2 = [2]
print(list1 > list2)
# 返回False
list3 = [1, 2, 4]
print(list1 < list3)
# 返回True
# 练习:比较这两个列表的大小
list4 = [1, 2, 3, 4.897, [3, 4, 5, 6]]
list5 = [1, 2, 3, 4.897, [1, 2, 3, 4]]
print(list4 > list5)
# 返回True
02-列表的删除
有一个长度是10的列表,数组内有10个人名,要求去掉重复的。
例如:names = [‘张三’, ‘李四’, ‘大黄’, ‘张三’, ‘张三’, ‘李四’, ‘大黄’, ‘张三’, ‘张三’, ‘李四’]
-> names = [‘张三’, ‘李四’, ‘大黄’]
names = ['张三', '李四', '大黄', '张三', '张三', '李四', '大黄', '张三', '张三', '李四']
# 1.间接去重
newNames1 = []
for i in names:
if i not in newNames1:
newNames1.append(i)
print(newNames1)
# not in和 in为成员运算,判断某个元素是否在容器中,返回True或者False
# 2.for循环判断次数去重
for i in names:
if names.count(i) > 1:
names.remove(i)
print(names)
# 结果:['李四', '大黄', '张三', '张三', '李四']
# 没删干净,for循环一开始执行时,获取元素本质其实还是依据下标,
# 张三拿出来下标为0,被删除后,李四下标变为0,后续元素下标对应减1,
# 此时进行第二次循环,获取的元素下标为1,此时下标为1的元素时原先下标为2的元素
# 要解决这个问题,可以从后向前删
names = ['张三', '李四', '大黄', '张三', '张三', '李四', '大黄', '张三', '张三', '李四']
for i in range(len(names)-1, -1, -1):
if names.count(names[i]) > 1:
del names[i]
print(names)
# 3.while循环判断元素个数
names = ['张三', '李四', '大黄', '张三', '张三', '李四', '大黄', '张三', '张三', '李四']
# x表示元素的下标
x = 0
while x <= len(names) - 1:
if names.count(names[x]) > 1:
del names[x]
else:
x += 1
print(names)
03-列表推导式
列表推导式(列表生成式)作用:更快的一次性生成有多个元素的列表
# 1.语法:[表达式 for 变量 in 容器]
list1 = [i for i in range(1, 11)]
print(list1)
# 2.语法:带条件的列表推导式
# [表达式 for 变量 in 容器 if 条件]
list2 = [i for i in range(1, 11) if i % 2 != 0]
print(list2)
# 3.语法:双重或多重循环
# [表达式 for 变量 in 容器 for 变量 in 容器]
list3 = [f'{i}*{j}={i * j}' for i in range(1, 10) for j in range(1, i + 1)]
print(list3)
# 练习:使用列表推导式,生成学生成绩
# 例如:5人的三科成绩 --> [[1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7],[7, 8, 9]]
import random
list4 = [[random.randint(0, 100) for _ in range(3)]for _ in range(5)]
print(list4)
04-列表练习题
练习1:30个人在一条船上,超载,需要15人下船,于是人们排成一队,排队的位置为他们的编号,报数,从1开始,数到9的人下船,如此循环,直到船上仅剩15人为止,问有那些编号的人下船了
# 自己写的
list1 = [i for i in range(1, 31)]
print(list1)
list2 = []
total = 0
while total < 15:
list2.append(list1[8])
del list1[8]
total += 1
print(f'下船的人编号为{list2}')
# 输出结果:下船的人编号为[9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
# 老师写的
result = []
people = [i for i in range(1, 31)]
while len(people) > 15:
num = 1
while num < 9:
num += 1
# pop能够拿到被删除的元素,append实现末尾追加
people.append(people.pop(0))
else:
# 数到9的人下标为8
result.append(people.pop(0))
print(f'下船的人编号为{result}')
练习2:有两个列表A和B,使用列表C来获取两个列表中的公共元素,例如:A = [1, ‘a’, 4, 90] B = [‘a’, 8, ‘j’, 1] -> C = [1, ‘a’]
# 自己写的
A = [1, 'a', 4, 90]
B = ['a', 8, 'j', 1]
C = []
for i in A:
for j in B:
if i == j:
C.append(i)
print(C)
# 老师写的
C1 = []
for i in A:
if i in B:
C1.append(i)
print(C1)
05-程序性能对比
在某种程度上,列表推导式可以去替代append方法,列表推导式也是向列表中添加元素,列表推导式性能优于append方法。
# 同时使用append和列表推导式向列表添加元素,性能对比
import time
start1 = time.time()
list1 = []
for i in range(1, 100000000):
list1.append(i)
end1 = time.time()
start2 = time.time()
list2 = [i for i in range(1, 100000000)]
end2 = time.time()
print(f'方式一花费时间:{end1 - start1}')
print(f'方式二花费时间:{end2 - start2}')
# 返回:
# 方式一花费时间:9.855588674545288
# 方式二花费时间:6.9104673862457275
# 比较规范的求程序时间的方式:一个程序运行成千上万次,求时间的平均值。
06-字符串
对于计算机来说,字符串就是一堆没有意义的符号。只是人根据自然语言,想象出和这一堆符号相关的含义,字符串就是由引号引起来的有限个符号的合集
字符串的性质:
1.字符串是有序的容器型数据类型(下标)
2.字符串是不可变的容器型数据类型(字符串中的元素一旦确定(字符串被定义出来时),无法再次修改,没有增删改)
3.字符串是使用引号(单引号、双引号、三引号)作为容器符号
4.字符串的数据类型:str
5.除了特殊符号(转义字符)之外,所有的符号放入到字符串中只能代表其本身
6.字符串分为:普通字符和转义字符
# 创建一个字符串
str1 = ''
print(str1, type(str1))
# 字符串的拼接、重复
str2 = 'abcd'
str3 = '1234'
print(str2 + str3)
print(str2 * 10)
字符串的比较大小:字符串比较大小是比较的同位置的元素,从左向右比较大小,直到比较到第一对不相同元素,来区分大小,字符串比较大小比较的是编码值的大小(python2使用的事ASCII编码表,python3使用的是Unicode编码表(万国码,utf-8))
0-9的范围:48-57;
A-Z:65-90;
a-z:97-122
print(str2 > str3)
# 返回True
print('兔' > '虎')
# chr:将编码值转换为对应的符号
# ord:能够将编码表中的符号转换成对应的十进制数值
print(ord('兔'), ord('虎'))
# 输出:20820 34382
print(chr(20820))
# 输出:兔
把所有的Unicode编码表中的符号拿出来:
# Unicode编码表和ASCII编码表的关系,Unicode是在ASCII的基础上拓展的
# 中文的范围:十六进制范围:\u4e00~\u9fa5
print(ord('\u4e00'), ord('\u9fa5'))
for i in range(19968, 40870):
print(chr(i), end='')
# 输出结果:所有的中文
07-查看中文拼音
python有一个三方模块叫pypinyin,能够查看汉字拼音
from pypinyin import pinyin
# 中文的范围:十六进制范围:\u4e00~\u9fa5
print(ord('\u4e00'), ord('\u9fa5'))
for i in range(19968, 40870):
print(chr(i), pinyin(chr(i), heteronym=True), end='')
08-字符串相关操作
1.字符串的遍历
str1 = 'abcdefg'
# 1.直接遍历
for i in str1:
print(i)
# 2.间接遍历
for i in range(len(str1)):
print(i, str1[i])
2.字符串的下标和切片与列表一摸一样
str2 = '王者荣耀和平精英奇迹暖暖'
# 1.得到:'王荣和精'
print(str2[0:7:2])
# 2.得到:'和平'
print(str2[4:6])
# 3.得到:'英精平和'
print(str2[-5:-9:-1])
3.字符串的成员运算:not in、in
# '王者荣耀'在不在str2中
print('王者荣耀' in str2)
# 返回:True
09-字符串相关方法
1.upper:将字符串中的所有小写字母转大写
str1 = '123abcdeABCDE'
print(str1.upper())
2.lower:将字符串中所有的大写字母转小写字母
print(str1.lower())
练习:将给定字符串中所有大写字母变为小写字母,所有小写字母变为大写字母
# 自己写的
str1 = '123abcdeABCDE'
str2 = str1[0:8]
str3 = str1[8:13]
print(str2.upper() + str3.lower())
# 输出:123ABCDEabcde
# 老师写的
str1 = '123abcdeABCDE'
str4 = ''
for i in str1:
if 'a' <= i <= 'z':
str4 += chr(ord(i) - 32)
elif 'A' <= i <= 'Z':
str4 += chr(ord(i) + 32)
else:
str4 += i
print(str4)
# 输出:123ABCDEabcde
10-练习
1.数字组合:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
list1 = [1, 2, 3, 4]
total = 0
for i in list1:
for j in list1:
for k in list1:
if i != j != k:
total += 1
print(i * 100 + j * 10 + k, end=' ')
print(f'符合条件的有{total}个')
2.A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉,日上三竿,A第一个醒来,他把鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。C、D、E依次醒来,也按同样的方法拿鱼。问他们至少捕了多少条鱼
"""
A=(fish - 1) // 5
B=((A * 4) - 1) // 5
C、D、E同理
"""
fish = 1
while True:
total = fish
for _ in range(5):
if (total - 1) % 5 == 0:
total = (total - 1) // 5 * 4
flag = True
else:
fish += 1
flag = False
break
if flag:
print(f'总鱼数为{fish}条')
break
3.30个人在一条船上,超载,需要15人下船,于是人们排成一队,拍的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15人为止,问都有那些编号的人下船了
list1 = []
result = []
list1.extend(range(1, 31))
while len(list1) > 15:
num = 1
while num < 9:
num += 1
list1.append(list1.pop(0))
else:
result.append(list1.pop(0))
print(f'编号为{result}的人下船了')
# 另一种方法
result = []
people = [i for i in range(1, 31)]
while len(people) > 15:
num = 1
for _ in range(9):
if num != 9:
people.append(people.pop(0))
num += 1
else:
result.append(people.pop(0))
print(f'下船的人分别是编号为{result}的人')
4.如果一个n位正整数等于其各位数字的n次方之和,则称该数位阿姆斯特朗数。请找出1000以内所有的阿姆斯特朗数,例如:1 ** 1 = 1、2 ** 1 = 2、1 ** 3 + 5 ** 3 + 3 ** 3 = 153等
# 自己写的
for i in range(1, 1000):
if i > 99:
if (i // 100) ** 3 + (i // 10 % 10) ** 3 + (i % 10) ** 3 == i:
print(i, end=' ')
elif 9 < i < 100:
if (i // 10) ** 2 + (i % 10) ** 2 == i:
print(i, end=' ')
else:
print(i, end=' ')
# 老师写的
# a.计算这个数字是几位数
# b.再次拿到各个位的数字,然后n次幂,求和
# 方法1:
for num in range(1, 1000):
length = 0
i = num
while i != 0:
i //= 10
length += 1
j = num
total = 0
for _ in range(length):
total += (j % 10) ** length
j //= 10
if total == num:
print(f'{num}是阿姆斯特朗数')
# 方法2:
for num in range(1, 1000):
length = len(str(num))
total = 0
for i in str(num):
total += int(i) ** length
if total == num:
print(f'{num}是阿姆斯特朗数')
5.判断一个数字是否是丑数
# 自己写的
num = int(input('请输入一个数字:'))
result = f'{num}是丑数' if num % 2 == 0 or num % 3 == 0 or num % 5 == 0 else f'{num}不是丑数'
print(result)
# 老师写的
number = 15
a = number
while True:
if number <= 0:
print('输入错误,请重新输入。')
else:
if number % 2 == 0:
number //= 2
elif number % 3 == 0:
number //= 3
elif number % 5 == 0:
number //= 5
elif number == 1:
print(f'{a}是丑数')
break
else:
print(f'{a}不是丑数')
break
6.输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)
str1 = input('请输入用户名')
flag = True
num = 0
if 'A' <= str1[0] <= 'Z':
for i in str1[1:]:
if 0 <= ord(i) <= 9 or 'A' <= i <= 'Z' or 'a' <= i <= 'z':
flag = True
if '0' <= i <= '9':
num += 1
else:
flag = False
if num != 0 and flag:
print('用户名合法')
else:
print('用户名不合法')
7.获取列表中出现次数最多的元素,例如:nums = [1,2,3,1,4,2,1,3,7,3,3] -> 打印:3
nums = [1, 2, 3, 2, 4, 2, 1, 3, 7, 3, 3]
max_count = 0
# list1空列表创建的作用就是用来解决隐藏条件的(有两个出现次数最多的元素)
list1 = []
for i in nums:
# 此分支用来解决单个元素出现次数最高
if max_count < nums.count(i):
max_count = nums.count(i)
list1.clear()
list1.append(i)
else:
#此分支用来解决多个元素出现次数最多
max_count = nums.count(i)
if i not in list1:
list1.append(i)
print(f'出现次数最多的元素是{i}')
day09
01-字符串相关方法
1.max、min方法:找到字符串中的最大值和最小值(按照编码值寻找)
str1 = 'abcdeABCDE'
print(min(str1), max(str1))
2.count:统计某个符号的次数
str2 = '12345abcde'
print(str2.count('1'))
3.index:查找某个元素的第一次出现的位置(下标),找到之后结束查找,找不到报错
查找方式:默认就是从左向右正序查找
语法1:str1.index(str2) --> 在str1中查找str2第一次出现的位置
语法2:str1.index(str2, 开始下标) -->可以指定开始查找的位置
str3 = 'abcde123abcde'
print(str3.index('c'))
# 查找第二个c的位置
print(str3.index('c', str3.index('c')+1))
4.find:和index方法一样,但是find方法不会报错,找不到元素返回-1
print('find方法', str3.find('c'))
print('find方法', str3.find('c', str3.find('c')+1))
print('find方法', str3.find('4'))
# 返回 find方法 2
# find方法 10
# find方法 -1
5.split:将字符串按照指定的元素进行切割,返回一个列表,列表中的元素便是切割点左右两边的元素
str4 = '1 2 3 4 5 6 7 8'
strlist = str4.split(' ')
print(str4.split(' '))
# 返回:['1', '2', '3', '4', '5', '6', '7', '8']
6.join:将字符串容器(字符串列表、字符串、字符串元组等)中的所有元素按照指定的符号拼接
str5 = '+'.join(strlist)
print(str5)
# 返回:1+2+3+4+5+6+7+8
02-字符串成员运算
成员运算:in、not in
str1 = '王者荣耀和平精英'
print('王' in str1)
# 输出:True
print('王者' in str1)
# 输出:True
print('王荣' not in str1)
# 输出:True
字符串的子串:有一段长度 >= 1,<=原字符串长度的字符串,属于原字符串的子串
03-字符串练习题
1.输入用户名,判断用户名是否合法(用户名长度6~10位)
# 自己写的
str1 = input('请输入用户名:')
if 6 <= len(str1) <=10:
print('用户名合法')
else:
print('用户名不合法')
# 老师写的
userName = '王大锤'
print('用户名合法' if 6 <= len(str1) <= 10 else '用户名非法')
2.输入用户名,判断用户名是否合法(用户名只能由数字和字母组成),例如:‘abc’ - 合法 ‘123’ - 合法 ‘abc123a’ - 合法
# 自己写的
str2 = input('请输入用户名:')
total = 0
for i in str2:
if 48 <= ord(i) <= 57 or 65 <= ord(i) <= 90 or 97 <= ord(i) <= 122:
total += 0
else:
total += 1
if total == 0:
print('用户名合法')
else:
print('用户名不合法')
# 老师写的:方法1
userName = '王大锤123'
flag = True
for i in userName:
if '0' <= i <= '9' or 'A' <= i <= 'Z' or 'a' <= i <= 'z':
continue
else:
print('用户名不合法')
flag = False
break
if flag:
print('用户名合法')
# 老师写的:方法2
userName = 'abc123'
for i in userName:
# 如果拿到的符号既不是数字也不是字母
# '0' <= i <= '9' or 'A' <= i <= 'Z' or 'a' <= i <= 'z'的结果为False
if not('0' <= i <= '9' or 'A' <= i <= 'Z' or 'a' <= i <= 'z'):
print('用户名不合法')
break
else:
print('用户名合法')
# for...else语法的else什么时候被执行,for循环正常结束时,else语法能够正常执行
# 如果for循环意外种植,else语句不会被执行
3.输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个必须是大写字母),例如:‘abc’ - 不合法 ‘123’ - 不合法 ‘abc123’ - 不合法,‘Abc’ - 不合法 ‘Abc123ahs’ - 合法
# 自己写的
str3 = input('请输入用户名:')
total = 0
letter = 0
number = 0
for i in str3:
if 48 <= ord(i) <= 57 or 65 <= ord(i) <= 90 or 97 <= ord(i) <= 122:
total += 0
else:
total += 1
for i in str3:
if 48 <= ord(i) <= 57:
number += 1
elif 65 <= ord(i) <= 90 or 97 <= ord(i) <= 122:
letter += 1
else:
total += 1
if number != 0 and letter != 0:
total += 0
else:
total += 1
if 65 <= ord(str3[0]) <= 90:
total += 0
else:
total += 1
if total == 0:
print('用户名合法')
else:
print('用户名不合法')
# 老师写的
userName = 'Abcahs'
flag = False
if 'A' <= userName[0] <= 'Z':
for i in userName[1:]:
if '0' <= i <= '9':
flag = True
continue
elif 'a' <= i <= 'z' or 'A' <= i <= 'Z':
continue
else:
print('非法')
break
else:
print('合法' if flag else '非法')
else:
print('非法')
4.输入一个字符串,统计字符串中非数字非字母的字符的个数
# 自己写的
str4 = input('请输入一个字符串:')
total = 0
for i in str4:
if 48 <= ord(i) <= 57 or 65 <= ord(i) <= 90 or 97 <= ord(i) <= 122:
total += 0
else:
total += 1
print(f'字符串中非数字非字母的字符的个数为{total}')
# 老师写的
str4 = 'anc3+93-sj胡说'
count = 0
for i in str4:
if not('0' <= i <= '9' or 'A' <= i <='Z' or 'a' <= i <= 'z'):
count += 1
print(f'非数字非字母的个数为 {count}')