python笔记task04:列表、元组、字符串

学习资料来自:列表

列表元组字符串

六、列表

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, 77))#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[i1]<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。如果 begend 指定值,则在指定范围内检查。
  • startswith(substr, beg=0,end=len(string)) 检查字符串是否以指定子字符串 substr 开头,如果是,返回 True,否则返回 False。如果 begend 指定值,则在指定范围内检查。
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值