4.1 列表
列表是有序集合,没有固定大小,能够保存任意数量任意类型的Python对象,语法为 [元素1, 元素2, …, 元素n]。
列表的创建方法:
- 常规
range()
- 推导式
- 多维数组
- 混合列表:含有多种数据类型的列表。
- 空列表
与元组不同,列表的内容可更改(mutable),因此附加 (append
,extend
)、插入 (insert
)、删除 (remove
,pop
) 这些操作都可以用在它身上。
方法/函数 | 作用 | 说明 |
---|---|---|
list.append(obj) | 在列表末尾添加一个新的对象 | 新对象可以是任何数据类型 |
list.extend(seq) | 在列表末尾添加一个列表 | 该列表可以有多个值 |
list.insert(index, obj) | 在编号index 位置插入obj | 插入在旧list 的index 之前一个位置 |
list.remove(obj) | 删除列表中第一个值为obj 的元素 | |
list.pop([index=-1]) | 弹出并返回列表中的一个元素 | 默认为最后一个元素 |
del var1[, var2, ...] | 删除单个或多个对象 | 需要知道元素在列表中的位置 |
list2 = list1 | 复制list1 给list2 | 复制的是列表地址,为浅拷贝 |
list2 = list1[:] | 复制list1 给list2 | 复制的是列表,为深拷贝。当且仅当列表为一维数组时,才为深拷贝 |
list.count(obj) | 统计obj 在列表中出现的次数 | |
list.index(obj[, start[, end]]) | 从列表中找出列表中第一个值为obj 的索引位置 | |
list.reverse() | 翻转列表元素的排列顺序 | |
list.sort(key=None, reverse=False) | 对list 进行排序 | reverse = True 为降序,False 为升序(默认) |
操作符 | 名称 | 作用 |
---|---|---|
== | 等号操作符 | 只有成员、成员位置都相同时才返回True |
+ | 连接操作符 | 首尾拼接列表 list4 = list1 + list2 |
* | 重复操作符 | 复制拼接列表 list5 = list3 * 3 |
in 或not in | 成员关系操作符 | 判断obj 是否在列表中 |
练习题:
1、列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
在列表的末尾增加元素15
在列表的中间位置插入元素20
将列表[2, 5, 6]合并到lst中
移除列表中索引为3的元素
翻转列表里的所有元素
对列表里的元素进行排序,从小到大一次,从大到小一次
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst.append(15)
#[2, 5, 6, 7, 8, 9, 2, 9, 9, 15]
lst.insert(len(lst)//2,20)
#[2, 5, 6, 7, 8, 20, 9, 2, 9, 9, 15]
lst = lst + [2,5,6]
#[2, 5, 6, 7, 8, 20, 9, 2, 9, 9, 15, 2, 5, 6]
del lst[3]
#[2, 5, 6, 8, 20, 9, 2, 9, 9, 15, 2, 5, 6]
lst.reverse()
#[6, 5, 2, 15, 9, 9, 2, 9, 20, 8, 6, 5, 2]
lst.sort(reverse=False)
#[2, 2, 2, 5, 5, 6, 6, 8, 9, 9, 9, 15, 20]
lst.sort(reverse=True)
#[20, 15, 9, 9, 9, 8, 6, 6, 5, 5, 2, 2, 2]
print(lst)
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
print(lst)
#[2, [8, 12], True]
3、leetcode 852题 山脉数组的峰顶索引
如果一个数组k符合下面两个属性,则称之为山脉数组
数组的长度大于等于3
存在i, i>0
且i < len(k) - 1
,使得k[0] < k[1] < ... < k[i-1] < k[j] > k[i+1] > ... > k[-1]
这个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
left = 0
right = len(A)-1
mid = (left + right) // 2
if A[left] <= A[mid] and A[mid] <= A[right]:
return False
elif A[left] >= A[mid] and A[mid] >= A[right]:
return False
for i,num in enumerate(A[1:-1]):
i = i + 1
if A[i-1] < num and num > A[i+1]:
return True
return False
4.2 元组
「元组」定义语法为:(元素1, 元素2, …, 元素n)
- Python 的元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串。
- 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。例如
x = (1,)
。
4.2.1 更新和删除元组
元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。
t1 = (1, 2, 3, [4, 5, 6])
print(t1) # (1, 2, 3, [4, 5, 6])
t1[3][0] = 9
print(t1) # (1, 2, 3, [9, 5, 6])
4.2.2 元组相关的操作符
和列表相关操作相同。
- 内置方法:元组大小和内容都不可更改,因此只有
count
和index
两种方法。
4.2.3 解压元组
- 解压(unpack)一维元组(有几个元素左边括号定义几个变量)
t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)
# 1 10.31 python
- 解压二维元组(按照元组里的元组结构来定义变量)
t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
# 1 10.31 OK python
- 如果你只想要元组其中几个元素,用通配符
*
,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了rest
变量。
t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c) # 1 2 5
print(rest) # [3, 4]
- 如果你根本不在乎 rest 变量,那么就用通配符
*
加上下划线_
。
t = 1, 2, 3, 4, 5
a, b, *_ = t
print(a, b) # 1 2
练习题:
1、元组概念
写出下面代码的执行结果和最终结果的类型
(1, 2)*2
(1, )*2
(1)*2
分析为什么会出现这样的结果.
答:
tuple
tuple
int,括号被当作成操作符
2、拆包过程是什么?
a, b = 1, 2
上述过程属于拆包吗?
可迭代对象拆包时,怎么赋值给占位符?
答:拆包就是将一个对象拆为多个对象,拆包实际上可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。除非我们用*
来表示忽略多余的元素。带*
的变量返回列表。
可见,上述过程为拆包。
_,*b = 1,2,3,4,5
print(b) #[2, 3, 4, 5]
4.3 字符串
- Python 中字符串被定义为引号之间的字符集合。
- Python 支持使用成对的单引号
' string '
或双引号" string "
。
常用转义字符 | 描述 |
---|---|
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\n | 换行 |
\t | 横向制表符(TAB) |
\r | 回车 |
4.3.1 字符串的切片与拼接
- 切片通常写成
start:end
这种形式,包括start
索引对应的元素,不包括end
索引对应的元素。即左闭右开。 - 索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。
4.3.2 字符串的常用方法
常用方法 | 作用 | 说明 |
---|---|---|
capitalize() | 将字符串的第一个字符转换为大写 | |
lower() | 转换字符串中所有大写字符为小写 | |
upper() | 转换字符串中的小写字母为大写 | |
swapcase() | 将字符串中大写转换为小写,小写转换为大写 | |
count(str, beg= 0,end=len(string)) | 返回str 在字符串里面出现的次数 | 如果设定beg 或者end 则返回指定范围内str 出现的次数 |
endswith(suffix, beg=0, end=len(string)) | 检查字符串是否以指定子字符串suffix 结束 | 如果是,返回True ,否则返回False 。如果beg 和end 指定值,则在指定范围内检查 |
startswith(substr, beg=0,end=len(string)) | 检查字符串是否以指定子字符串substr 开头 | 如果是,返回 True,否则返回 False。如果 beg 和 end 指定值,则在指定范围内检查 |
find(str, beg=0, end=len(string)) | 检测str 是否包含在字符串中 | 如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回-1 |
rfind(str, beg=0,end=len(string)) | 类似于 find() 函数 | 不过是从右边开始查找 |
isnumeric() | 如果字符串中只包含数字字符,则返回 True,否则返回 False | |
ljust(width[, fillchar]) | 返回一个原字符串左对齐,并使用fillchar(默认空格)填充至长度width的新字符串 | |
rjust(width[, fillchar]) | 返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度width的新字符串 | |
lstrip([chars]) | 截掉字符串左边的空格或指定字符 | |
rstrip([chars]) | 删除字符串末尾的空格或指定字符 | |
strip([chars]) | 在字符串上执行lstrip() 和rstrip() | |
partition(sub) | 找到子字符串sub,把字符串分为一个三元组(pre_sub,sub,fol_sub) | 如果字符串中不包含sub则返回('原字符串','','') |
rpartition(sub) | 类似于partition()方法 | 不过是从右边开始查找 |
replace(old, new [, max]) | 把将字符串中的old 替换成new | 如果max 指定,则替换不超过max 次 |
split( str, num) | 以str 为分隔符切片字符串,默认为空格
| 如果num 参数有设置,则仅分隔num 个子字符串,返回切片后的子字符串拼接的列表 |
splitlines([keepends]) | 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表 | 如果参数keepends为 False,不包含换行符,如果为 True,则保留换行符 |
maketrans(intab, outtab) | 创建字符映射的转换表 | 第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标 |
translate(table, deletechars="") | 根据参数table 给出的表,转换字符串的字符,要过滤掉的字符放到deletechars 参数中 |
4.3.3 字符串格式化
format
格式化函数
str8 = "{0} Love {1}".format('I', 'Lsgogroup') # 位置参数
print(str8) # I Love Lsgogroup
str8 = "{a} Love {b}".format(a='I', b='Lsgogroup') # 关键字参数
print(str8) # I Love Lsgogroup
str8 = "{0} Love {b}".format('I', b='Lsgogroup') # 位置参数要在关键字参数之前
print(str8) # I Love Lsgogroup
str8 = '{0:.2f}{1}'.format(27.658, 'GB') # 保留小数点后两位
print(str8) # 27.66GB
字符串格式化符号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串,用str()方法处理对象 |
%r | 格式化字符串,用rper()方法处理对象 |
%d | 格式化整数 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | 根据值的大小决定使用%f或%e |
%G | 作用同%g,根据值的大小决定使用%f或%E |
- 格式化操作符辅助指令
符号 | 功能 |
---|---|
m.n | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
- | 用作左对齐 |
+ | 在正数前面显示加号( + ) |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
练习题:
1、字符串函数回顾
- 怎么批量替换字符串中的元素?答:
replace()
- 怎么把字符串按照空格进⾏拆分?答:
split()
- 怎么去除字符串⾸位的空格?答:
lstrip()
2、实现isdigit函数
题目要求:实现函数isdigit, 判断字符串里是否只包含数字0~9
def isdigit(string):
"""
判断字符串只包含数字
:param string:
:return:
"""
# your code here
if string.isnumeric():
return True
else:
return False
isdigit('214312') #True
isdigit('21d2') #False
3、leetcode 5题 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: “babad”
输出: “bab”
输入: “cbbd”
输出: “bb”
class Solution:
def longestPalindrome(self, s: str) -> str:
# your code here