欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Datawhale组队 15 期 Python:Task04---列表、元组和字符串

程序员文章站 2024-01-22 12:31:04
x = [[0 for col in range(3)] for row in range(4)]怎么拆解?复制列表中的所有元素(浅拷贝)。浅拷贝与深拷贝区别?前面三种方法(append, extend, insert)可对列表增加元素,它们没有返回值,是直接修改了原数据对象。 而将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。x.reverse() 该方法没有返回值,但是会对列表的对象进行排序。练习题:...

列表

  1. 列表的定义
    列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象,语法为 [元素1, 元素2, …, 元素n]。
  2. 列表的创建
  • 创建一个普通列表 x=[]
  • 利用range() 创建列表
  • 利用推导式创建列表
    == x = [[0 for col in range(3)] for row in range(4)] 怎么拆解?==

由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。

  1. 向列表中添加元素
  • list.append(obj) 在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。
  • list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
  • list.insert(index, obj) 在编号 index 位置插入 obj。
  1. 删除列表中的元素
  • list.remove(obj) 移除列表中某个值的第一个匹配项
  • list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
  • del var1[, var2 ……] 删除单个或多个对象。
  1. 获取列表中的元素
  • 切片的通用写法是 start : stop : step
    复制列表中的所有元素(浅拷贝)。
    浅拷贝与深拷贝区别?
  1. 列表的常用操作符
  • 等号操作符:==
  • 连接操作符 +
  • 重复操作符 *
  • 成员关系操作符 in、not in

「等号 ==」,只有成员、成员位置都相同时才返回True。

列表拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。

(append, extend, insert)三种方法可对列表增加元素,它们没有返回值,是直接修改了原数据对象。 而将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。

  1. 列表的其他方法
  • 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

存在iiii >0 且i<len(k)1i<\operatorname{len}(k)-1, 使得k[0]<k[1]<<k[i1]<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]

这个ii就是顶峰索引。

现在,给定一个山脉数组,求顶峰索引。

示例:

输入:[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. 创建和访问一个元组
    print(8 * (8))  # 64
    print(8 * (8,))  # (8, 8, 8, 8, 8, 8, 8, 8)
    
  2. 更新和删除一个元组
  3. 元组相关的操作符
  • 等号操作符:==
  • 连接操作符 +
  • 重复操作符 *
  • 成员关系操作符 in、not in
    「等号 ==」,只有成员、成员位置都相同时才返回True。

元组拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。
5. 内置方法

  • count(‘python’) 是记录在元组 t 中该元素出现几次,显然是 1 次
  • index(10.31) 是找到该元素在元组 t 的索引,显然是 1
  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解释器中是将多个数据,或多组数据,装进一个元组,赋值给一个变量。

可迭代对象拆包时,怎么赋值给占位符?

  • 如果需要表示几个元素的变量,用*变量名表示
  • 如果不在乎是什么变量,可以用*_表示几个元素的变量,进行占位

字符串

  1. 字符串的定义
    Python 的常用转义字符
转义字符 描述
\ 反斜杠符号
单引号
" 双引号
\n 换行
\t 横向制表符(TAB)
\r 回车

原始字符串只需要在字符串前边加一个英文字母 r 即可。
我有个变量表示原始字符串,怎么表示?
三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。

  1. 字符串的切片与拼接
  2. 字符串的常用内置方法
  • 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!!!
  1. 字符串格式化
  • 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