Datawhale组队 15 期 Python:Task04---列表、元组和字符串
列表
- 列表的定义
列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象,语法为 [元素1, 元素2, …, 元素n]。 - 列表的创建
- 创建一个普通列表 x=[]
- 利用range() 创建列表
- 利用推导式创建列表
== x = [[0 for col in range(3)] for row in range(4)] 怎么拆解?==
由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。
- 向列表中添加元素
- list.append(obj) 在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。
- list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
- list.insert(index, obj) 在编号 index 位置插入 obj。
- 删除列表中的元素
- list.remove(obj) 移除列表中某个值的第一个匹配项
- list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
- del var1[, var2 ……] 删除单个或多个对象。
- 获取列表中的元素
- 切片的通用写法是 start : stop : step
复制列表中的所有元素(浅拷贝)。
浅拷贝与深拷贝区别?
- 列表的常用操作符
- 等号操作符:==
- 连接操作符 +
- 重复操作符 *
- 成员关系操作符 in、not in
「等号 ==」,只有成员、成员位置都相同时才返回True。
列表拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。
(append, extend, insert)三种方法可对列表增加元素,它们没有返回值,是直接修改了原数据对象。 而将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。
- 列表的其他方法
- list.count(obj) 统计某个元素在列表中出现的次数
- list.index(x[, start[, end]]) 从列表中找出某个值第一个匹配项的索引位置
- list.reverse() 反向列表中元素
x.reverse() 该方法没有返回值,但是会对列表的对象进行排序。 - list.sort(key=None, reverse=False) 对原列表进行排序。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
该方法没有返回值,但是会对列表的对象进行排序。
练习题:
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)
print(lst) # [2, 5, 6, 7, 8, 9, 2, 9, 9, 15]
lst.insert(int(len(lst)/2), 20)
print(lst) # [2, 5, 6, 7, 8, 20, 9, 2, 9, 9, 15]
lst.extend([2, 5, 6])
print(lst) # [2, 5, 6, 7, 8, 20, 9, 2, 9, 9, 15, 2, 5, 6]
lst.pop(3)
print(lst) # [2, 5, 6, 8, 20, 9, 2, 9, 9, 15, 2, 5, 6]
lst.reverse()
print(lst) # [6, 5, 2, 15, 9, 9, 2, 9, 20, 8, 6, 5, 2]
lst.sort()
print(lst) # [2, 2, 2, 5, 5, 6, 6, 8, 9, 9, 9, 15, 20]
lst.sort(reverse=True)
print(lst) # [20, 15, 9, 9, 9, 8, 6, 6, 5, 5, 2, 2, 2]
2、修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
3、leetcode 852题 山脉数组的峰顶索引
如果一个数组k符合下面两个属性,则称之为山脉数组
数组的长度大于等于3
存在, >0 且, 使得
这个就是顶峰索引。
现在,给定一个山脉数组,求顶峰索引。
示例:
输入:[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
元组
列表和元组的区别?
- 创建和访问一个元组
print(8 * (8)) # 64 print(8 * (8,)) # (8, 8, 8, 8, 8, 8, 8, 8)
- 更新和删除一个元组
- 元组相关的操作符
- 等号操作符:==
- 连接操作符 +
- 重复操作符 *
- 成员关系操作符 in、not in
「等号 ==」,只有成员、成员位置都相同时才返回True。
元组拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。
5. 内置方法
- count(‘python’) 是记录在元组 t 中该元素出现几次,显然是 1 次
- index(10.31) 是找到该元素在元组 t 的索引,显然是 1
-
解压元组
元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。如果你只想要元组其中几个元素,用通配符「」,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量。
如果你根本不在乎 rest 变量,那么就用通配符「」加上下划线「_」。
练习题:
1、元组概念
写出下面代码的执行结果和最终结果的类型
(1, 2)*2
(1, )*2
(1)*2
分析为什么会出现这样的结果.
print((1, 2)*2) # (1, 2, 1, 2)
print((1, )*2) # (1, 1)
print((1)*2) # 2
# 解释: (1,2), (1,) 都是元组类型,*2是复制的意思, (1) 括号是运算符,是整型,相当于1*2
2、拆包过程是什么?
a, b = 1, 2
上述过程属于拆包吗?
不属于,这个就是分别赋值
拆包(也叫解包): 对于函数中的多个返回数据, 去掉元组, 列表 或者字典 直接获取里面数据的过程.(或者说是将一个序列类型的数据拆开为多个数据,分别赋值给变量,位置对应。)
在这个过程中,星号实际上是起到了一个组包的作用。
补充:
组包: 通俗的讲,组包就是将多个数据装进一个包中。
拆包时要注意:
- 需要拆的数据的个数要与变量的个数相同,否则程序会异常
- 除了对元组拆包之外,还可以对列表、字典等拆包
- 对字典拆包后获取的是字典的key值, 而不是value值
- 如果序列的元素个数多于变量个数时:
①可将非第一位的变量前加星号(*);
②并且拆包的变量中只能有一个变量前可加星号(*);
③这个星号表面它后边的变量是个列表。
注意有关*的一个问题:
- ①在拆包时的那个星已经在python解释器内自动使用了,进行了组包,得到了一个列表。
- ②如果输出时再加个星号,python解释器自动对*后面的变量解包,是把组包后的列表再次解包。此星号非彼星号。
# 例如:
x=[1,2,3]
print(x) # [1,2,3]
print(*x) # 1,2,3
- 在不知道多少个元素时,可以利用*来定义变量,在定义函数时,如果不确定有多少个实参时,就可以使用*来定义形参;
例如:常常会看到这样的函数写法: func(*args)
在python解释器中是将多个数据,或多组数据,装进一个元组,赋值给一个变量。
可迭代对象拆包时,怎么赋值给占位符?
- 如果需要表示几个元素的变量,用*变量名表示
- 如果不在乎是什么变量,可以用*_表示几个元素的变量,进行占位
字符串
- 字符串的定义
Python 的常用转义字符
转义字符 | 描述 |
---|---|
\ | 反斜杠符号 |
’ | 单引号 |
" | 双引号 |
\n | 换行 |
\t | 横向制表符(TAB) |
\r | 回车 |
原始字符串只需要在字符串前边加一个英文字母 r 即可。
我有个变量表示原始字符串,怎么表示?
三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
- 字符串的切片与拼接
- 字符串的常用内置方法
- capitalize() 将字符串的第一个字符转换为大写。
- lower() 转换字符串中所有大写字符为小写。
- upper() 转换字符串中的小写字母为大写。
- swapcase() 将字符串中大写转换为小写,小写转换为大写。
- 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()。
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'
- partition(sub) 找到子字符串sub,把字符串分为一个三元组(pre_sub,sub,fol_sub),如果字符串中不包含sub则返回(‘原字符串’,’’,’’)。
- rpartition(sub)类似于partition()方法,不过是从右边开始查找。
- replace(old, new [, max]) 把 将字符串中的old替换成new,如果max指定,则替换不超过max次。
- split(str="", num) 不带参数默认是以空格为分隔符切片字符串,如果num参数有设置,则仅分隔num个子字符串,返回切片后的子字符串拼接的列表。
str5 = ' I Love LsgoGroup '
print(str5.strip().split()) # ['I', 'Love', 'LsgoGroup']
print(str5.strip().split('o', 1)) # ['I L', 've LsgoGroup']
print(str5.strip().split('o', 2)) # ['I L', 've Lsg', 'Group']
print(str5.strip().split('o', 3)) # ['I L', 've Lsg', 'Gr', 'up']
print(str5.strip().split('o', 4)) # ['I L', 've Lsg', 'Gr', 'up']
- 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']
- 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!!!
- 字符串格式化
- format 格式化函数
- Python 字符串格式化符号
符 号 | 描述 |
---|---|
%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(old, new)
怎么把字符串按照空格进⾏拆分? .split()
怎么去除字符串⾸位的空格? strip()
2、实现isdigit函数
题目要求
实现函数isdigit, 判断字符串里是否只包含数字0~9
def isdigit(string):
"""
判断字符串只包含数字
:param string:
:return:
"""
# your code here
if string.isnumeric():
return True
else:
return False
3、leetcode 5题 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: “babad”
输出: “bab”
输入: “cbbd”
输出: “bb”
class Solution:
def longestPalindrome(self, s: str) -> str:
# your code here
感悟:
忽然我发现,我每次参加组队的话,至少会把内容都学一遍,把自己不熟悉的不会的做成笔记,但是自己学习东西就不行,坚持不下来,我也许可以借鉴 Datawhale 的这种形式,自行指定一个计划,也是列出几天一个知识点,也许可以更好的坚持下去.而且 Datawhale 的这个可以自己学习后做成自己的知识体系图谱.
本文地址:https://blog.csdn.net/z583706/article/details/107613490