2022年 11月 7日

Python训练营Task04【列表、元组、字符串】

一、学习内容概要

目录

一、学习内容概要

二、主要学习内容

A.列表

1.列表的定义

2. 列表的创建

3. 向列表中添加元素

4. 删除列表中的元素

5. 获取列表中的元素

6. 列表的常用操作符

7. 列表的其它方法

B.元组

1.创建和访问一个元组

2. 更新和删除一个元组

3. 元组相关的操作符

4. 内置方法

5. 解压元组

练习题:

B.字符串

1. 字符串的定义

2. 字符串的切片与拼接

3. 字符串的常用内置方法

4. 字符串格式化

练习题:

三、疑惑点

四、学习感悟


二、主要学习内容

A.列表

1.列表的定义

列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象,语法为 [元素1, 元素2, ..., 元素n]

  • 关键点是「中括号 []」「逗号 ,」

  • 中括号 把所有元素绑在一起

  • 逗号 将每个元素一一分开

2. 列表的创建

 【例子】

  1. #创建一个新列表
  2. newlist = ["one","two","three","four","five","six","seven","eight","nine"]
  3. #输出这个列表和类型
  4. print(newlist,type(newlist))
  5. #['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
  6. #<class 'list'>
  • 利用range()创建列表

【例子】

  1. #range(10)表示从 0 到 9
  2. x = list(range(10))
  3. print(x, type(x))
  4. # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
  5. #range(1,11,2)表示从 1 到 10,每次递增 2
  6. x = list(range(1, 11, 2))
  7. print(x, type(x))
  8. # [1, 3, 5, 7, 9] <class 'list'>
  9. #range(10, 1, -2)表示从 10 到 1,每次递减 2
  10. x = list(range(10, 1, -2))
  11. print(x, type(x))
  12. # [10, 8, 6, 4, 2] <class 'list'>
  • 利用推导式创建列表

(哈哈,在这里我就忘记了推导式是啥了,还好之前写了博客,我去翻看了之前的笔记,就瞬间明白了,加深了理解。看来学习后认真做好学习内容的总结和经常翻看复习是很有必要的。)

【例子】(自己的理解都写在注释里了)

  1. #[0]*5表示5个这样的列表,再比如 [1,2]*5,输出结果就是[1,2,1,2,1,2,1,2,1,2]
  2. x = [0] * 5
  3. print(x, type(x))
  4. # [0, 0, 0, 0, 0] <class 'list'>
  5. # [0 for i in range(5)]表示对于0到5的每个元素都赋值为0
  6. x = [0 for i in range(5)]
  7. print(x, type(x))
  8. # [0, 0, 0, 0, 0] <class 'list'>
  9. #[i for i in range(10)]表示对与0到10的每个元素都赋值为每个元素自己
  10. x = [i for i in range(10)]
  11. print(x, type(x))
  12. # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
  13. #[i for i in range(1, 10, 2)]表示对1到10,每次递增2 的每个元素赋值给自己
  14. x = [i for i in range(1, 10, 2)]
  15. print(x, type(x))
  16. # [1, 3, 5, 7, 9] <class 'list'>
  17. # [i for i in range(10, 1, -2)]表示对10到1,每次递减2 的每个元素赋值给自己
  18. x = [i for i in range(10, 1, -2)]
  19. print(x, type(x))
  20. # [10, 8, 6, 4, 2] <class 'list'>
  21. #[i ** 2 for i in range(1, 10)]表示
  22. x = [i ** 2 for i in range(1, 10)]
  23. print(x, type(x))
  24. # [1, 4, 9, 16, 25, 36, 49, 64, 81] <class 'list'>
  25. #0到99的中不能被2整除和能被3整除的每个元素都赋值给自己,
  26. x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
  27. print(x, type(x))
  28. # [3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99] <class 'list'>

  • 创建一个 4×3的二维数组

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。

【例子】

  1. #创建一个元素为[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]的数组,也即二维数组
  2. x = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
  3. print(x, type(x))
  4. # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]] <class 'list'>
  5. for i in x:
  6. print(i, type(i))
  7. # [1, 2, 3] <class 'list'>
  8. # [4, 5, 6] <class 'list'>
  9. # [7, 8, 9] <class 'list'>
  10. # [0, 0, 0] <class 'list'>
  1. #col 和 row 分别表示横坐标和纵坐标
  2. x = [[0 for col in range(3)] for row in range(4)]
  3. print(x, type(x))
  4. # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>

注意:

由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。即使保存一个简单的[1,2,3],也有3个指针和3个整数对象。

x = [a] * 4操作中,只是创建4个指向list的引用,所以一旦a改变,x中4个a也会随之改变。

  1. a = [0] * 3
  2. x = [a] * 4
  3. print(x, type(x))
  4. # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
  5. a = [2] * 3
  6. x = [a] * 4
  7. print(x, type(x))
  8. # [[2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2]] <class 'list'>

  • 创建一个混合列表

混合列表是指列表中数据类型混合,不只一种

  1. mix = [1, 'lsgo', 3.14, [1, 2, 3]]
  2. print(mix, type(mix))
  3. # [1, 'lsgo', 3.14, [1, 2, 3]] <class 'list'>
  • 创建一个空列表

  1. empty = []
  2. print(empty, type(empty)) # [] <class 'list'>

列表不像元组,列表内容可更改 (mutable),因此附加 (append, extend)、插入 (insert)、删除 (remove, pop) 这些操作都可以用在它身上。

3. 向列表中添加元素

  • list.append(obj) 在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。

  1. x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
  2. x.append('Thursday')
  3. print(x)
  4. # ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday']
  5. #len(x)表示返回列表中的字符数
  6. print(len(x))
  7. # 6

此元素如果是一个 list,那么这个 list 将作为一个整体进行追加,注意append()extend()的区别。

append是整建制地追加,extend是个体化扩编。

 extend将它的参数视为 list,extend的行为是把这两个list接到一起,append是将它的参数视为element,作为一个整体添加上去的。 List里可以有任意的数据类型,所以,要分清这俩函数的区别。

  1. x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
  2. x.append(['Thursday', 'Sunday'])
  3. print(x)
  4. # ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ['Thursday', 'Sunday']]
  5. print(len(x))
  6. # 6

list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

严格来说 append 是追加,把一个东西整体添加在列表后,而 extend 是扩展,把一个东西里的所有元素添加在列表后。

4. 删除列表中的元素

  • list.remove(obj) 移除列表中某个值的第一个匹配项

  1. x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
  2. y = x.pop(-2)
  3. print(y)
  4. # Wednesday

removepop 都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引。

  • del var1[, var2 ……] 删除单个或多个对象。

        del 也可以删除中间一段连续的元素,格式为:

        del listname[start : end]

  1. x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
  2. del x[0:2]
  3. print(x)
  4. # ['Wednesday', 'Thursday', 'Friday']

如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()

5. 获取列表中的元素

  • 通过元素的索引值,从列表获取单个元素,注意,列表索引值是从0开始的。

  • 通过将索引指定为-1,可让Python返回最后一个列表元素,索引 -2 返回倒数第二个列表元素,以此类推。

  1. x = ['Monday', 'Tuesday', 'Wednesday', ['Thursday', 'Friday']]
  2. print(x[0], type(x[0])) # Monday <class 'str'>
  3. print(x[-1], type(x[-1])) # ['Thursday', 'Friday'] <class 'list'>
  4. print(x[-2], type(x[-2])) # Wednesday <class 'str'>

        关于切片的内容这里给出两篇详细介绍

Python中切片的详细介绍-Python教程-PHP中文网

[Python]切片完全指南(语法篇) – 知乎 (zhihu.com)

6. 列表的常用操作符

  • 等号操作符:==

  • 连接操作符 +

  • 重复操作符 *

  • 成员关系操作符 innot in

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

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

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

7. 列表的其它方法

list.count(obj) 统计某个元素在列表中出现的次数

list.index(x[, start[, end]]) 从列表中找出某个值第一个匹配项的索引位置

list.reverse() 反向列表中元素

list.sort(key=None, reverse=False) 对原列表进行排序。

  • key — 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

  • reverse — 排序规则,reverse = True 降序, reverse = False 升序(默认)。

  • 该方法没有返回值,但是会对列表的对象进行排序。

B.元组

「元组」定义语法为:(元素1, 元素2, ..., 元素n)

  • 小括号把所有元素绑在一起

  • 逗号将每个元素一一分开

1.创建和访问一个元组

  • Python 的元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串。

  • 元组使用小括号,列表使用方括号。

  • 元组与列表类似,也用整数来对它进行索引 (indexing) 和切片 (slicing)。

  • 创建元组可以用小括号 (),也可以什么都不用,为了可读性,建议还是用 ()。

  • 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。

2. 更新和删除一个元组

元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。

3. 元组相关的操作符

  • 等号操作符:==

  • 连接操作符 +

  • 重复操作符 *

  • 成员关系操作符 innot in

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

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

4. 内置方法

元组大小和内容都不可更改,因此只有 countindex 两种方法。

  • count('python') 是记录在元组 t 中该元素出现几次,显然是 1 次

  • index(10.31) 是找到该元素在元组 t 的索引,显然是 1

5. 解压元组

解压(unpack)一维元组(有几个元素左边括号定义几个变量)

  1. t = (1, 10.31, 'python')
  2. (a, b, c) = t
  3. print(a, b, c)
  4. # 1 10.31 python

解压二维元组(按照元组里的元组结构来定义变量)

  1. t = (1, 10.31, ('OK', 'python'))
  2. (a, b, (c, d)) = t
  3. print(a, b, c, d)
  4. # 1 10.31 OK python

如果你只想要元组其中几个元素,用通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量。

如果你根本不在乎 rest 变量,那么就用通配符「*」加上下划线「_」。

练习题:

1、元组概念

写出下面代码的执行结果和最终结果的类型

(1, 2)*2
(1, )*2
(1)*2

分析为什么会出现这样的结果.

2、拆包过程是什么?

a, b = 1, 2

上述过程属于拆包吗?

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

B.字符串

1. 字符串的定义

  • Python 中字符串被定义为引号之间的字符集合。

  • Python 支持使用成对的 单引号 双引号。

  • Python 的常用转义字符

 如果字符串中需要出现单引号或双引号,可以使用转义符号\对字符串中的符号进行转义。

原始字符串只需要在字符串前边加一个英文字母 r 即可。

三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。

2. 字符串的切片与拼接

  • 类似于元组具有不可修改性

  • 从 0 开始 (和 Java 一样)

  • 切片通常写成 start:end 这种形式,包括「start 索引」对应的元素,不包括「end索引」对应的元素。

  • 索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。

3. 字符串的常用内置方法

  • capitalize() 将字符串的第一个字符转换为大写。

  • lower() 转换字符串中所有大写字符为小写。

  • upper() 转换字符串中的小写字母为大写。

  • swapcase() 将字符串中大写转换为小写,小写转换为大写。

  • count(str, beg= 0,end=len(string)) 返回str在 string 里面出现的次数,如果beg或者end指定则返回指定范围内str出现的次数。

  • endswith(suffix, beg=0, end=len(string)) 检查字符串是否以指定子字符串 suffix 结束,如果是,返回 True,否则返回 False。如果 begend 指定值,则在指定范围内检查。

  • startswith(substr, beg=0,end=len(string)) 检查字符串是否以指定子字符串 substr 开头,如果是,返回 True,否则返回 False。如果 begend 指定值,则在指定范围内检查。

  • find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 begend,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回 -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) 不带参数默认是以空格为分隔符切片字符串,如果num参数有设置,则仅分隔num个子字符串,返回切片后的子字符串拼接的列表。

  • splitlines([keepends]) 按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数keepends为 False,不包含换行符,如果为 True,则保留换行符。

  • maketrans(intab, outtab) 创建字符映射的转换表,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

  • translate(table, deletechars="") 根据参数table给出的表,转换字符串的字符,要过滤掉的字符放到deletechars参数中。

4. 字符串格式化

  • format 格式化函数

  • Python 字符串格式化符号

 

  • 格式化操作符辅助指令

 

练习题:

1、字符串函数回顾

  • 怎么批量替换字符串中的元素?

  • 怎么把字符串按照空格进⾏拆分?

  • 怎么去除字符串⾸位的空格?

2、实现isdigit函数

题目要求

实现函数isdigit, 判断字符串里是否只包含数字0~9

def isdigit(string):
    """
    判断字符串只包含数字
    :param string:
    :return:
    """
    # your code here
    pass

3、leetcode 5题 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例:

输入: “babad”

输出: “bab”

输入: “cbbd”

输出: “bb”

class Solution:
   def longestPalindrome(self, s: str) -> str:
          
    # your code here

三、疑惑点

1、这个例子没看懂,网上也找不到。

  1. x[0][0] = 1
  2. print(x, type(x))
  3. # [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>

2、list.insert(index, obj) 在编号 index 位置插入 obj

这句话也没看懂 

四、学习感悟

本次学习较为匆忙,内容多且零碎,其中还有很多尚未理解的语句和用法,大部分例子都是照着所给例子给出的加上自己的一点点理解,总之,这次的学习状态不是很好,希望我能尽快调整,合理分配好时间,跟上节奏。这次真是偷大懒了,后续会自己补回来,还有练习题。