学习资料来自:列表
列表元组字符串
六、列表
1.定义
[元素1, 元素2, ..., 元素n]
有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象。
2.创建
(1)
普通创建
list(range())
x = list(range(10, 1, -2))
print(x, type(x))
# [10, 8, 6, 4, 2] <class 'list'>
说明:步长这里表明range也支持倒着数,但是步长要写成负数,否则:
list(range(10, 1, 2))
#[]
列表推导式
几个特殊例子:
x = [0] * 5
print(x, type(x))
# [0, 0, 0, 0, 0] <class 'list'>
"""
「乘号 *」可以对列表进行复制拼接,后面有说
"""
x = [0 for i in range(5)]
print(x, type(x))
# [0, 0, 0, 0, 0] <class 'list'>
x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
print(x, type(x))
# [3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99] <class 'list'>
(2)创建一个4×3的二维数组
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
print(x, type(x))
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]] <class 'list'>
注意区分list和array
for i in x:
print(i, type(i))
# [1, 2, 3] <class 'list'>
# [4, 5, 6] <class 'list'>
# [7, 8, 9] <class 'list'>
# [0, 0, 0] <class 'list'>
x = [[0 for col in range(3)] for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
注意:
x = [[col for col in range(3)] for row in range(4)]
print(x, type(x))
#[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]] <class 'list'>
类似于x = [0 for i in range(5)]
前面的[col for col in range(3)]
并不受range(4)的影响,因此list(range(3))输出了4遍,变成了这样的二维数组。
这里将x[0][0]赋值为1
x[0][0] = 1
print(x, type(x))
#[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]] <class 'list'>
x = [[0] * 3 for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
x[1][1] = 1
print(x, type(x))
# [[0, 0, 0], [0, 1, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
list的元素可以是任何对象,列表中保存的是对象的指针。
python中一切皆是对象,对象都是在堆上存放的,一切都是指针。
>>> a = 5
>>> id(a)
140726915864352
>>> id(5)
140726915864352
5和a都是一个指针,指向一个地址。
id()可以返回变量的地址。
基于上面的思想,即使保存[1,2,3]
这么简单的list,也会有3个指针和3个整数对象。
x = [a] * 4操作中,只是创建4个指向list的引用,所以一旦a改变,x中4个a也会随之改变。
如下:
x = [[0] * 3] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>
a = [0] * 3
x = [a] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
神奇的一幕出现了:
x[0][0] = 1
print(x, type(x))
这是为什么呢?
原来
a = [0] * 3
x = [a] * 4
print(a,type(a),'\n',x, type(x))
"""
[0, 0, 0] <class 'list'>
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
"""
因此令x[0][0] = 1
时,相当于是让a[0] = 1
如下:
x[0][0] = 1
print(a,type(a),'\n',x, type(x))
"""
[1, 0, 0] <class 'list'>
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>
"""
我们能很清楚地看到a中的元素变了,也就印证前面说的:
x = [a] * 4操作中,只是创建4个指向list的引用,所以一旦a改变,x中4个a也会随之改变。
(3)创建一个混合列表
mix = [1, 'lsgo', 3.14, [1, 2, 3]]
print(mix, type(mix))
# [1, 'lsgo', 3.14, [1, 2, 3]] <class 'list'>
(4)创建一个空列表
empty = []
print(empty, type(empty)) # [] <class 'list'>
我们也常常先创建一个空列表,然后再存放进我们的数据。
注意:列表是可变对象所以可以更改(mutable)其内容。
3.向列表中添加元素
(1).append(obj)
list.append(obj)
在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.append(3)
print(x)
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 3]
print(len(x)) # 6
也可以append一个list。但list会作为整体放进去。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.append(['Thursday', 'Sunday'])
print(x)
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ['Thursday', 'Sunday']]
print(len(x)) # 6
x[0],x[5]# ('Monday', ['Thursday', 'Sunday'])
(2).extend(obj)
如果我们不想将list作为一个整体添加进去,又不想一个一个添加怎么办?
list.extend(seq)
该方法无返回值,但是会在已存在的列表中添加新的列表内容。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.extend(['Thursday', 'Sunday'])
print(x)
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday', 'Sunday']
print(len(x)) # 7
严格来说
append
是追加,把一个东西整体添加在列表后,而extend
是扩展,把一个东西里的所有元素添加在列表后。
(3).insert(index,obj)
list.insert(index, obj)
在编号 index
位置插入 obj
。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.insert(2, 'Sunday')
print(x)
# ['Monday', 'Tuesday', 'Sunday', 'Wednesday', 'Thursday', 'Friday']
print(len(x)) # 6
这里,编号2后的元素会向后推移。
4.删除列表中元素
(1).remove(obj)
list.remove(obj)
移除列表中某个值的第一个匹配项
如何理解这句话?
比如
x = ['Monday', 'Tuesday', 'Tuesday','Wednesday', 'Thursday', 'Friday']
x.remove('Tuesday')
print(x)
#['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
它并不会把所有'Tuesday'
移除。
(2).pop(index,obj)
list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
y = x.pop()
print(y) # Friday
x
"""
Friday
['Monday', 'Tuesday', 'Wednesday', 'Thursday']
"""
#Friday 是返回值
接着:
y = x.pop(0)
print(y) # Monday
y = x.pop(-2)
print(y) # Wednesday
print(x) # ['Tuesday', 'Thursday']
(3)remove和pop的区别
前者是指定具体要删除的元素,后者是指定一个索引。而且pop有返回值。
(4)del
del var1[, var2 ……]
删除单个或多个对象。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del x[0:2] #即删除列表中索引0到2(不包括2)的值
print(x) # ['Wednesday', 'Thursday', 'Friday']
如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()。
为什么呢?
5.获取列表中元素
(1)通过索引获取
- 通过元素的索引值,从列表获取单个元素,注意,列表索引值是从0开始的。
- 通过将索引指定为-1,可让Python返回最后一个列表元素,索引 -2 返回倒数第二个列表元素,以此类推。
x = ['Monday', 'Tuesday', 'Wednesday', ['Thursday', 'Friday']]
print(x[-1][-2],type(x[-1][-2]))#Thursday <class 'str'>
(2)通过切片获取
切片的通用写法是 start : stop : step
.
比如x[0:3]就是从索引0开始取,取到3(不包括3),即取0,1,2。注意:step默认为1。
若第一个索引为0,也可以省略。
不指定stop,那么将从指定的start开始,一直取完整个列表。
若指定了stop为最后一个元素的索引,那么取到的列表将不包括最后一个元素
miffy = list(range(101))
miffy #[0,1,2,...,100]
miffy[50:]#[50,51,52,...,100]
miffy[100:100] #这样取到的是空列表[]
我用range演示是因为默认的range生成的list的索引和内容是一致的,便于观察和学习。
再来用星期试试。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(x[3:]) # ['Thursday', 'Friday']
print(x[-3:]) # ['Wednesday', 'Thursday', 'Friday']
print(x[:2])#['Monday', 'Tuesday']
print(x[:-3])#['Monday', 'Tuesday']
下面可以取到全列表:
x[: :]#['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x[ : ]#['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
如果想倒着取列表怎么办?
以具体的 step
从编号 start
往编号 stop
切片。注意最后把 step
设为 -1(或者其他负数),相当于将列表反向排列。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:4:2]) # ['Tuesday', 'Thursday']
print(week[:4:2]) # ['Monday', 'Wednesday']
print(week[1::2]) # ['Tuesday', 'Thursday']
print(week[::-1])
# ['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']
浅拷贝与深拷贝
1)浅拷贝
先来看一个浅拷贝的例子——复制列表中所有元素
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[:])
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
这个在前面我提过,因为start不写的话默认是0,stop默认取完列表,step默认是1.
2)浅拷贝与深拷贝
list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]
print(list2) # [123, 456, 789, 213]
print(list3) # [123, 456, 789, 213]
list1.sort()
print(list2) # [123, 213, 456, 789]
print(list3) # [123, 456, 789, 213]
list1 = [[123, 456], [789, 213]]
list2 = list1
list3 = list1[:]
print(list2) # [[123, 456], [789, 213]]
print(list3) # [[123, 456], [789, 213]]
list1[0][0] = 111
print(list2) # [[111, 456], [789, 213]]
print(list3) # [[111, 456], [789, 213]]
浅拷贝和深拷贝的区别可以参考:Python—copy()、deepcopy()与赋值的区别
6.列表的常用操作符
等号操作符:==
连接操作符 + 用来首位拼接列表
重复操作符 * 用来复制拼接列表
成员关系操作符 in、not in
「等号 ==」,只有成员、成员位置都相同时才返回True。
关于首尾拼接和复制拼接,最简单的例子:
miffy = [0,1,2]
new_miffy = miffy + [3]
new2_miffy = miffy*3
print(new_miffy)#[0, 1, 2, 3]
print(new2_miffy)#[0, 1, 2, 0, 1, 2, 0, 1, 2]
print(0 in new_miffy)#True
print(4 in new_miffy)#False
print(new_miffy == new2_miffy)#False
前面三种方法(append, extend, insert)可对列表增加元素,它们没有返回值,是直接修改了原数据对象。 而将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。
7.列表的其他方法
(1)list.count(obj)统计某个元素在列表中出现的次数
list1 = [123, 456] * 3
print(list1) # [123, 456, 123, 456, 123, 456]
num = list1.count(123)
print(num) # 3
(2)list.index(x[, start[, end]]) 从列表中找出某个值第一个匹配项的索引位置
文档里说的不清楚,菜鸟教程这里写的比较好。
x-- 查找的对象。
start-- 可选,查找的起始位置。
end-- 可选,查找的结束位置。
返回值
该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。
list1 = [123, 456] * 5
print(list1) #[123, 456, 123, 456, 123, 456, 123, 456, 123, 456]
print(list1.index(123)) # 0
print(list1.index(123, 1)) # 2 这里1写的是起始位置
print(list1.index(123, 3, 7)) # 4 其实这个7写不写没影响,如下
print(list1.index(123, 3))#4
但是:
print(list1.index(123, 7,7))#ValueError: 123 is not in list
这是因为从7开始从7结束并没有123
改一下:
print(list1.index(123, 7,8))#ValueError: 123 is not in list
8的位置是有一个123,但还是报错了,说明这个end和切片、range里的stop一样,都是左闭右开的。
插一嘴:
list(range(100,1,-1))
#[100,99,98,...,2]也是左闭右开的,不要以为倒数就不是了
(3)list.reverse()反向列表中元素
x = [123, 456, 789]
x.reverse()
print(x) # [789, 456, 123]
(4)list.sort(cmp=None,key=None, reverse=False) 对原列表进行排序。
- cmp – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。该参数已取消
key
– 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse
– 排序规则,reverse = True
降序,reverse = False
升序**(默认)**。- 该方法没有返回值,但是会对列表的对象进行排序。
记住默认升序!
x = [123, 456, 789, 213]
x.sort()
print(x)
# [123, 213, 456, 789]
x.sort(reverse=True)
print(x)
# [789, 456, 213, 123]
# 获取列表的第二个元素
def takeSecond(elem):
return elem[1]
x = [(2, 2), (3, 4), (4, 1), (1, 3)]
x.sort(key=takeSecond)#指定第二个元素排序
print(x)
# [(4, 1), (2, 2), (1, 3), (3, 4)]
x.sort(key=lambda a: a[0])
print(x)
# [(1, 3), (2, 2), (3, 4), (4, 1)]按照第一维来排序
x.sort(key=lambda a: a[1])
print(x)
#[(4, 1), (2, 2), (1, 3), (3, 4)]按照第二维来排序
参考:python3排序
key=lambda 元素: 元素[字段索引]
相似的用法:
print(max(C, key=lambda x: x[0]))
x:x[]字母可以随意修改,求最大值方式按照中括号[]里面的维度,[0]按照第一维,[1]按照第二维。
num = [(1,2.5), (1.5, 3.2), (1.3, 4.0), (2.2, 1.8)]
y,z = max(num, key=lambda x:x[1])
print(y, z)
即输出四组值中第二个数的最大值,即结果
(1.3,4.0)
8.列表练习题
调试有点错误,后面改了再把代码放上来。
(1)列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
在列表的末尾增加元素15
在列表的中间位置插入元素20
将列表[2, 5, 6]合并到lst中
移除列表中索引为3的元素
翻转列表里的所有元素
对列表里的元素进行排序,从小到大一次,从大到小一次
(2)修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
(3)leetcode 852题 山脉数组的峰顶索引
如果一个数组k符合下面两个属性,则称之为山脉数组
数组的长度大于等于3
存在 i i i, i i i >0 且 i < len ( k ) − 1 i<\operatorname{len}(k)-1 i<len(k)−1, 使得 k [ 0 ] < k [ 1 ] < … < k [ i − 1 ] < k [ j ] > k [ i + 1 ] … > k [ len ( k ) − 1 ] \mathrm{k}[0]<\mathrm{k}[1]<\ldots<\mathrm{k}[\mathrm{i}-1]<\mathrm{k}[\mathrm{j}]>\mathrm{k}[\mathrm{i}+1] \ldots>\mathrm{k}[\operatorname{len}(\mathrm{k})-1] k[0]<k[1]<…<k[i−1]<k[j]>k[i+1]…>k[len(k)−1]
这个 i i i就是顶峰索引。
现在,给定一个山脉数组,求顶峰索引。
示例:
输入:[1, 3, 4, 5, 3]
输出:True
输入:[1, 2, 4, 6, 4, 5]
输出:False
class Solution:
def peakIndexInMountainArray(self, A: List[int]) -> int:
# your code here
七、元组
比较熟悉,后面想到再补充。
八、字符串
1.python常用转义字符
转义字符 | 描述 |
---|---|
\ | 反斜杠符号 |
’ | 单引号 |
" | 双引号 |
\n | 换行 |
\t | 横向制表符(TAB) |
\r | 回车 |
还有一个参考的:
print("hello","\n","miffy")
"""
hello
miffy
"""
print('let\'s go') # let's go
print("let's go") # let's go
print('C:\\now') # C:\now
print("C:\\Program Files\\Intel\\Wifi\\Help")
# C:\Program Files\Intel\Wifi\Help
关于反斜杠符号:
为了在输出中出现\而不被当成转义字符,可以打两个,即\。
print("C:\\Program\nFiles\\Intel\\Wifi\\Help")
"""
C:\Program
Files\Intel\Wifi\Help
"""
#在\n前再打一个\,如下:
print("C:\\Program\\nFiles\\Intel\\Wifi\\Help")
#C:\Program\nFiles\Intel\Wifi\Help
如果引号内的字符都要保留原始形式,只需要在字符串前边加一个英文字母 r 即可。
print(r'C:\Program Files\Intel\Wifi\Help')
# C:\Program Files\Intel\Wifi\Help
三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
para_str = """这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
"""
print(para_str)
# 这是一个多行字符串的实例
# 多行字符串可以使用制表符
# TAB ( )。
# 也可以使用换行符 [
# ]。
para_str = '''这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
'''
print(para_str)
# 这是一个多行字符串的实例
# 多行字符串可以使用制表符
# TAB ( )。
# 也可以使用换行符 [
# ]。
不要把这里的三引号和注释中的搞混了,注释可没有把右边字符串赋给一个变量。
2.字符串的切片与拼接
- 类似于元组具有不可修改性
- 从 0 开始 (和 Java 一样)
- 切片通常写成 start:end 这种形式,包括「start 索引」对应的元素,不包括「end索引」对应的元素。
- 索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。
str1 = 'I Love LsgoGroup'
print(str1[:6]) # I Love
print(str1[5]) # e
print(str1[:6] + " 插入的字符串 " + str1[6:])
# I Love 插入的字符串 LsgoGroup
这里串和L之间有两个空格,因为str1[6]本身是空格。
s = 'Python'
print(s) # Python
print(s[2:4]) # th 小技巧stop-start=切片后元素个数
print(s[-5:-2]) # yth
print(s[2]) # t
print(s[-1]) # n
3.字符串的常用内置方法
(1)capitalize()
capitalize()
将字符串的第一个字符转换为大写。
str2 = 'xiaoxie'
print(str2.capitalize()) # Xiaoxie
(2)大小写转换
lower() 转换字符串中所有大写字符为小写。
upper() 转换字符串中的小写字母为大写。
swapcase() 将字符串中大写转换为小写,小写转换为大写。
str2 = "DAXIExiaoxie"
print(str2.lower()) # daxiexiaoxie
print(str2.upper()) # DAXIEXIAOXIE
print(str2.swapcase()) # daxieXIAOXIE
(3)count()
count(str, beg= 0,end=len(string))
返回str
在 string 里面出现的次数,如果beg
或者end
指定则返回指定范围内str
出现的次数。
类似用法list.count(obj)
str2 = "DAXIExiaoxie"
print(str2.count('xi')) # 2
返回的是指定字符出现次数。
(4)endswith和startwith
endswith(suffix, beg=0, end=len(string))
检查字符串是否以指定子字符串suffix
结束,如果是,返回 True,否则返回 False。如果beg
和end
指定值,则在指定范围内检查。startswith(substr, beg=0,end=len(string))
检查字符串是否以指定子字符串substr
开头,如果是,返回 True,否则返回 False。如果beg
和end
指定值,则在指定范围内检查。
str2 = "DAXIExiaoxie"
print(str2.endswith('ie')) # True
print(str2.endswith('xi')) # False
print(str2.startswith('Da')) # False
print(str2.startswith('DA')) # True
说明:
str2 = "DAXIExiaoxie"
print(str2.startswith('DA',0,1)) # False
str2 = "DAXIExiaoxie"
print(str2.startswith('DA',0,2)) # True
参数同样是左闭右开的。
(5)find和rfind
- find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回 -1。
- rfind(str, beg=0,end=len(string)) 类似于 find() 函数,不过是从右边开始查找。
str2 = "DAXIExiaoxie"
print(str2.find('xi')) # 5
print(str2.find('ix')) # -1
print(str2.rfind('xi')) # 9
print(str2.rfind('ie',-2)) # 10
print(str2.rfind('ie',-2,-1)) # -1
也是左闭右开。
(6)isnumeric()
isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False。
str3 = '12345'
print(str3.isnumeric()) # True
str3 += 'a'
print(str3.isnumeric()) # False
(7)ljust和rjust——多看看
- ljust(width[, fillchar])返回一个原字符串左对齐,并使用fillchar(默认空格)填充至长度width的新字符串。
- rjust(width[, fillchar])返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度width的新字符串。
str4 = '1101'
print(str4.ljust(8, '0')) # 11010000
print(str4.rjust(8, '0')) # 00001101
(8)lstrip、rstrip、strip——多看看
- lstrip([chars]) 截掉字符串左边的空格或指定字符。
- rstrip([chars]) 删除字符串末尾的空格或指定字符。
- strip([chars]) 在字符串上执行lstrip()和rstrip()。
str5 = ' I Love LsgoGroup '
print(str5.lstrip()) # 'I Love LsgoGroup '
print(str5.lstrip().strip('I')) # ' Love LsgoGroup '
print(str5.rstrip()) # ' I Love LsgoGroup'
print(str5.strip()) # 'I Love LsgoGroup'
print(str5.strip().strip('p')) # 'I Love LsgoGrou'
对比一下:
str5 = ' I Love LsgoGroup '
str4 = 'I Love LsgoGroup '
print(str5)
print(str4)
print(str5.lstrip().strip('I'))
截掉I的时候,是不会把I左边的空格也截掉的。因为是指定字符。
(9)partition和rpartition——多看看
- partition(sub) 找到子字符串sub,把字符串分为一个三元组(pre_sub,sub,fol_sub),如果字符串中不包含sub则返回(‘原字符串’,’’,’’)。
- rpartition(sub)类似于partition()方法,不过是从右边开始查找。
str5 = ' I Love LsgoGroup '
print(str5.strip().partition('o')) # ('I L', 'o', 've LsgoGroup')
print(str5.strip().partition('m')) # ('I Love LsgoGroup', '', '')
print(str5.strip().rpartition('o')) # ('I Love LsgoGr', 'o', 'up')
(9)replace(old, new [, max])
replace(old, new [, max]) 把 将字符串中的old替换成new,如果max指定,则替换不超过max次。
str5 = ' I Love LsgoGroup '
print(str5.strip().replace('I', 'We')) # We Love LsgoGroup
(10)split(str="", num)
具体的语法说明:
str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。 num – 分割次数。默认为 -1, 即分隔所有。
str5 = ' I Love LsgoGroup '
print(str5.strip().split()) # ['I', 'Love', 'LsgoGroup']
print(str5.strip().split('o')) # ['I L', 've Lsg', 'Gr', 'up']
u = "www.baidu.com.cn"
# 使用默认分隔符
print(u.split()) # ['www.baidu.com.cn']
# 分割0次就是不分隔
print((u.split(".", 0))) # ['www.baidu.com.cn']
# 分割一次
print((u.split(".", 1))) # ['www', 'baidu.com.cn']
同样也可以用这个方法去掉换行符,还有一些不想要的括号
string = "hello boy<[www.baidu.com]>byebye"
print(string.split('[')[1].split(']')[0]) # www.baidu.com
print(string.split('[')[1].split(']')[0].split('.')) # ['www', 'baidu', 'com']
这个例子我没看懂。
(11)splitlines([keepends])——多看看
splitlines([keepends]) 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数keepends为 False,不包含换行符,如果为 True,则保留换行符。
str6 = 'I \n Love \n LsgoGroup'
print(str6.splitlines()) # ['I ', ' Love ', ' LsgoGroup']
print(str6.splitlines(True)) # ['I \n', ' Love \n', ' LsgoGroup']
(12)maketrans和translate——多看看
maketrans(intab, outtab) 创建字符映射的转换表,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
translate(table, deletechars="") 根据参数table给出的表,转换字符串的字符,要过滤掉的字符放到deletechars参数中。
str7 = 'this is string example....wow!!!'
intab = 'aeiou'
outtab = '12345'
trantab = str7.maketrans(intab, outtab)
print(trantab) # {97: 49, 111: 52, 117: 53, 101: 50, 105: 51}
print(str7.translate(trantab)) # th3s 3s str3ng 2x1mpl2....w4w!!!
4.字符串格式化
format
格式化函数
一些会用到的表格:
5.字符串练习题
(1)字符串函数回顾
怎么批量替换字符串中的元素?
ST1 = "I love u"
ST1.replace("love","hate")#'I hate u'
怎么把字符串按照空格进⾏拆分?
对于一个字符串,比如
st = "m f fy"
st.split(" ")#['m', 'f', 'fy']
怎么去除字符串首位的空格?
st2 = " miffy"
st2_new = st2.lstrip()
st2_new #'miffy'
(2)实现isdigit函数
题目要求
实现函数isdigit, 判断字符串里是否只包含数字0~9
def isdigit(string):
"""
判断字符串只包含数字
:param string:
:return:
"""
# your code here
pass
答:
def isdigit(string):
"""
判断字符串只包含数字
:param string:
:return:
"""
if string.isnumeric() == True:
return "只有数字"
else :
return "字符串中不是只有数字"
isdigit("2132334134234") #'只有数字'
isdigit("123123hsddbbchsbdh")#'字符串中不是只有数字'
(3)leetcode 5题 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: “babad”
输出: “bab”
输入: “cbbd”
输出: “bb”
首先明确什么是回文字串,回文串(palindromic string)是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。
class Solution:
# 暴力匹配(超时)
def longestPalindrome(self, s: str) -> str:
# 特判
size = len(s)
if size < 2:
return s
max_len = 1
res = s[0]
# 枚举所有长度大于等于 2 的子串
for i in range(size - 1):
for j in range(i + 1, size):
if j - i + 1 > max_len and self.__valid(s, i, j):
max_len = j - i + 1
res = s[i:j + 1]
return res
def __valid(self, s, left, right):
# 验证子串 s[left, right] 是否为回文串
while left < right:
if s[left] != s[right]:
return False
left += 1
参考:
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/
来源:力扣(LeetCode)