Python列表和字符串

本文介绍了Python中列表的基本操作,如遍历、拼接、重复、增删改元素,以及列表的方法如index、sort、sorted、reverse、extend等。同时,讨论了字符串的特性,如不可变性,以及比较、遍历、下标、切片、成员运算等。还涉及了列表推导式和字符串的转换方法,如upper、lower。文章最后给出了多个编程练习题,涉及字符串和列表的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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}')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老树盘根_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值