1、列表操作练习,列表lst 内容如下:
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
1)在列表的末尾增加元素15
lst= [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst.append(15) #在列表的末尾增加元素15,用append
#lst.extend([15])#用extend在列表末尾添加元素15
print("末尾增加元素15:")
print(lst)
运行结果:
末尾增加元素15:
[2, 5, 6, 7, 8, 9, 2, 9, 9, 15]
2)在列表的中间位置插入元素20
lst= [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst.insert(5, 20)#在列表的中间位置(第5个元素后面)插入元素20
print("中间位置插入元素20:")
print(lst)
运行结果:
中间位置插入元素20:
[2, 5, 6, 7, 8, 20, 9, 2, 9, 9]
3)将列表[2, 5, 6]合并到lst中
lst= [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst.append([2,5,6])#用append将列表[2, 5, 6]合并到列表中
print("将列表[2, 5, 6]合并到列表:")
print(lst)
运行结果:
将列表[2, 5, 6]合并到列表:
[2, 5, 6, 7, 8, 9, 2, 9, 9, [2, 5, 6]]
4)移除列表中索引为3的元素
lst= [2, 5, 6, 7, 8, 9, 2, 9, 9]
y = lst.pop(3)#移除列表中索引为3的元素
print("移除列表中索引为3的元素:")
print(lst)
运行结果:
移除列表中索引为3的元素:
[2, 5, 6, 8, 9, 2, 9, 9]
5)翻转列表里的所有元素
lst= [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst=lst[::-1] #翻转列表里的所有元素
print("翻转列表里的所有元素:") #翻转列表里的所有元素
print(lst)
运行结果:
翻转列表里的所有元素:
[9, 9, 2, 9, 8, 7, 6, 5, 2]
6)对列表里的元素进行排序,从小到大一次,从大到小一次
lst= [2, 5, 6, 7, 8, 9, 2, 9, 9]
#对列表里的元素进行排序,从小到大一次,从大到小一次
lst.sort(reverse=True)#降序
print("降序:")
print(lst)
lst.sort(reverse=False)#升序
print("升序:")
print(lst)
运行结果:
降序:
[9, 9, 9, 8, 7, 6, 5, 2, 2]
升序:
[2, 2, 5, 6, 7, 8, 9, 9, 9]
2、修改列表
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
lst = [1,[4,6],True]
lst[0] = lst[0]*2 #将列表第一项修改为原来的两倍
#将列表第二项修改为原来的两倍
lst[1][0]=lst[1][0]*2
lst[1][1]=lst[1][1]*2
lst[2]*2#将列表第三项修改为原来两倍
print(lst)
运行结果:
[2, [8, 12], 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:
while(1):
for i in range(len(A)):
if A[i]<A[i+1]:
k=len(A)-i
if A[k-1]>A[k]:
print("True")
print("i")
else:
print("False")
else:
print("False")
break
break
return
4、元组概念
写出下面代码的执行结果和最终结果的类型,并分析为什么会出现这样的结果。
1)(1, 2)*2
x = (1,2)*2
print(x)
print(type(x))
运行结果:
(1, 2, 1, 2)
2)(1, )*2
y = (1,)*2
print(y)
print(type(y))
运行结果:
(1, 1)
3)(1)*2
z = (1)*2
print(z)
print(type(z))
运行结果:
2
分析结果:
1)创建元组可以用小括号 (),也可以什么都不用,为了可读性,建议还是用 ()。
2)元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。
3)前面两个都是元组复制,第三个的括号被当成了运算符,没有实际意义。
5、1)拆包过程是什么?
拆包就相当于把元组中的元素拆分成单个的元素。
a.解压(unpack)一维元组(有几个元素左边括号定义几个变量)
t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)
运行结果: 1 10.31 python
b.解压二维元组(按照元组里的元组结构来定义变量)
t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
运行结果:1 10.31 OK python
c.如果你只想要元组其中几个元素,用通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量。
t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c)
print(rest)
运行结果:
1 2 5
[3, 4]
d.如果你根本不在乎 rest 变量,那么就用通配符「*」加上下划线「_」。
t = 1, 2, 3, 4, 5
a, b, *_ = t
print(a, b)
运行结果:1 2
2)a, b = 1, 2
上述过程属于拆包吗?
a,b=1,2
print(a,b)
运行结果:1 2
上述过程属于平行赋值,也属于拆包。这个赋值的过程,其实也就是拆包的过程,将元素的信息由变量接收它。但是在拆包的过程中,必须将右侧的所有信息全部拆完。所以如果没有可变参数的话,左侧的参数个数一定要等于右侧列表/元组内元素个数。平行赋值即等号左右两边的变量和值可以是多个,但是要保证数量一致。a,b=1,2即a=1,b=2
3)可迭代对象拆包时,怎么赋值给占位符?
在可迭代对象拆包时,使用_(单个元素),*_(连续多个元素)进行占位。
6、字符串函数回顾
1)怎么批量替换字符串中的元素?
replace(old, new [, max])
把 将字符串中的old替换成new,如果max指定,则替换不超过max次
str = ' I Love English. '
print(str.strip().replace('I Love', 'We hate'))
运行结果:We hate English.
2)怎么把字符串按照空格进行拆分?
split(str="", num) 不带参数默认是以空格为分隔符切片字符串,如果num参数有设置,则仅分隔num个子字符串,返回切片后的子字符串拼接的列表。
str5 = ' I Love LsgoGroup '
print(str5.strip().split())
运行结果:[‘I’, ‘Love’, ‘LsgoGroup’]
3)怎么去除字符串首位的空格?
lstrip([chars]) 截掉字符串左边的空格或指定字符。
str5 = ' I Love LsgoGroup '
print(str5.lstrip())
运行结果:I Love LsgoGroup
7、实现isdigit函数:实现函数isdigit, 判断字符串里是否只包含数字0~9
1)可直接利用
str1 = "一千一百零一"
str2 = "1101"
str3 = "a"
str4 = ","
print(str1.isdigit())
print(str2.isdigit())
print(str3.isdigit())
print(str4.isdigit())
运行结果:
False
True
False
False
2)简化
str = input("请您输入一串字符串:")
print(str.isdigit())
输入:123 运行结果:True
输入:ss 运行结果:False
3)函数表示
def isdigit(string):
"""
判断字符串只包含数字
:param string:
:return:
"""
for i in string:
if (i >= '0' and i <= '9'):
print("True")
else:
print("False")
8、leetcode 5题 最长回文子串:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: “babad”
输出: “bab”
输入: “cbbd”
输出: “bb”
1)把每个字母当成回文串的中心
这里要考虑两种情况,回文串的长度为奇数或者偶数情况
#把每个字母当成回文串的中心
class Solution:
def longestPalindrome(self, s: str) -> str:
k = len(s)
self.res = ""
def sett(i,j):
while i >= 0 and j < k and s[i] == s[j]:
i -= 1
j += 1
if len(self.res) < j - i -1 :
self.res = s[i+1:j]
for i in range(k):
sett(i,i)
sett(i,i+1)
return self.res
2)把每个字母当成回文串的结束
#把每个字母当成回文串的结束
class Solution:
def longestPalindrome(self, s: str) -> str:
if not s:
return ""
max_len = 1
k = len(s)
start = 0
for i in range(1,n):
even = s[i-max_len:i+1]#偶数
odd = s[i - max_len-1:i+1]#奇数
if i - max_len - 1 >= 0 and odd == odd[::-1]:
start = i - max_len - 1
max_len += 2
elif i - max_len >=0 and even == even[::-1]:
start = i - max_len
max_len += 1
return s[start: start+max_len]