Python基础知识(四):一文看懂列表、元组和字符串操作

序列

  • 序列是具有索引和切片能力的集合.
  • 列表、元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力。
  • 列表、元组、字符串都属于序列

1 列表

  • 列表(List)是Python中非常重要的内置数据类型。列表由一系列元素组成,所有的元组被包含在一对方括号中。列表被创建将后,可以执行添加、删除、修改操作。
  • 列表中可包含任意的Python数据信息,如字符串、数字、列表、元组等。
    在这里插入图片描述

1.1 列表介绍

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

【例子】

>>> list = [ “a”, “b”, “c” ],定义字符列表。
>>> list = [ 1, 2, 3, 4 ],定义数字列表。
>>> list = [ [1,2,3,4], ["a","b","c"] ],定义列表的列表。
>>> list = [ (1,2,3,4), ("a","b","c") ],定义元组列表。
>>> list((1,2))把一个元组转换成一个列表[1,2]list('test')可把
字符串转换成['t','e','s','t']列表 

列表须知:

  • 列表内元素的个数及元素的值可以改变;
  • 列表内元素用中括号([])包裹;
  • 列表内不同元素之间采用逗号(,)分隔;
  • 列表内可以包含任何数据类型,也可以包括另一个列表;
  • 列表可以通过序号来访问其中的成员;
  • 可以对列表进行插入、删除、排序,修改列表中某元素等操作。

1.2 列表操作

列表的所有操作如下表所示:
在这里插入图片描述

1.2.1 列表脚本操作符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。在这里插入图片描述

1.2.2 列表切片

切片操作(slice)可以从一个列表中获取子列表(列表的一部分)。我们使用一对方括号、起始偏移量start、终止偏移量end 以及可选的步长step 来定义一个分片。
在这里插入图片描述

格式: [start: end: step]
• [:] 提取从开头(默认位置0)到结尾(默认位置-1)的整个字符串
• [start:] 从start 提取到结尾
• [:end] 从开头提取到end - 1
• [start: end] 从start 提取到end - 1
• [start: end: step] 从start 提取到end - 1,每step 个字符提取一个
• 左侧第一个字符的位置/偏移量为0,右侧最后一个字符的位置/偏移量为-1

【例子】

>>> list = [1, 2, 3, 4, 5, 6, 7]
>>> list[1:] #列出索引1以后的---------[2, 3, 4, 5, 6, 7]
>>> list[:-1] #列出索引-1之前的-------[1, 2, 3, 4, 5, 6]
>>> list[1:3] #列出索引1到3之间的-----[2]
>>> list[::-1]#[7, 6, 5, 4, 3, 2, 1] #形成reverse函数的效果:

1.2.3 浅拷贝和深拷贝

  • 浅拷贝:浅拷贝意味着构造一个新的集合对象,然后用原始对象中找到的子对象的引用来填充它。从本质上讲,浅层的复制只有一层的深度。复制过程不会递归,因此不会创建子对象本身的副本。
  • 深拷贝:深拷贝使复制过程递归。这意味着首先构造一个新的集合对象,然后递归地用在原始对象中找到的子对象的副本填充它。以这种方式复制一个对象,遍历整个对象树,以创建原始对象及其所有子对象的完全独立的克隆。

A. 赋值引用

a = {
    
    1:[1,2,3]}
b = a
print(id(a) == id(b))

输出:

True

赋值引用,a 和 b 都指向同一个对象。
赋值

B. 浅拷贝

a = {
    
    1:[1,2,3]}
b = a.copy()
print(id(a) == id(b))
print(id(a[1]) == id(b[1]))

输出:

False
True

a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
图3.2 浅拷贝
C. 深度拷贝

import copy
a = {
    
    1:[1,2,3]}
b = copy.deepcopy(a)
print(id(a) == id(b))
print(id(a[1]) == id(b[1]))
print(id(a[1][0]) == id(b[1][0]))

输出:

False
False
True

a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。对于a[1][0]和b[1][0]还是对于对象1的引用,并没有重新新建一个对象,这符合python的存储机制。
图3.3 深拷贝

1.2.4 其他常用操作

------ 列表排序:
注意排序优先级:数字>大写字母>小写字母>符号>中文
Python list内置sort() 方法用来排序,也可以使用Python内置的全局sorted() 方法对可迭代的序列排序生成新的序列。

  • 永久性排序:sort()
    list.sort(key=None, reverse=False) 对原列表进行排序。
    key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。该方法没有返回值,但是会对列表的对象进行排序。
  • 临时性排序:sorted()
    Python内置函数,
  • 反转排序:reverse()

【例子】

>>> list1 = [3, 5, 1, 6, 9]
>>> lsit2 = [3, 5, 1, 6, 9]
>>> a = list1.sort()   #永久性排序,就是这个列表就变了
>>> print(a, l1) 
# None [1, 3, 5, 6, 9]
    
>>> b =sorted(list1)    #临时性排序,就是可以赋值某个变量
>>> print(b, list1)
# [1, 3, 5, 6, 9] [3, 5, 1, 6, 9]

>>> c = list2.reverse()
>>> print(c, list2)
# None [9, 6, 1, 5, 3]

------ list中的append和extend的区别:

  • list.append(object) 向列表中添加一个对象object
  • list.extend(sequence) 把一个序列seq的内容添加到列表中

2 元组

2.1 元组操作

  • Python 的元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串。
  • 元组使用小括号,列表使用方括号。
  • 元组可以使用在不希望数据被其他操作改变的场合。
    在这里插入图片描述

2.2 解压元组

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

(a, b, c)  = (1, 10.31, 'python')
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 变量,那么就用通配符「*」加上下划线「_」。
【例子】

a, b, *_ = t
print(a, b)  # 1 2

3 字符串

3.1 字符串介绍

字符串的定义:
字符串为引号之间的字符集合,这里引号包括单引号、双引号,三引号(三个连续的单引号或双引号)。

【例子】

>>> s1='I love Python'
>>> s1
'I love Python'

>>> s2=str([1,2,3])
>>> s2
'[1, 2, 3]' 

Python的转义字符
在这里插入图片描述
字符串前加 u、r、b

  • u"中文字符组成的字符串"
    作用:以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
  • r"\n\n\n\n”  # 表示一个普通生字符串 \n\n\n\n,而不表示换行
    作用:去掉反斜杠的转义机制,常用于正则表达式,对应着re模块。
  • b’Hello World’ # 表示这是一个 bytes 对象
    作用:b" "前缀表示:后面字符串是bytes 类型。在网络编程中,服务器和浏览器只认bytes 类型数据。在 Python3 中,bytes 和 str 的互相转换方式是str.encode(‘utf-8’)和bytes.decode(‘utf-8’)。

3.2 字符串格式化

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。
【例子】

print "My name is %s and weight is %d kg!" % ('Zara', 21)
# My name is Zara and weight is 21 kg!

python 字符串格式化符号:
在这里插入图片描述
格式化操作符辅助指令:
在这里插入图片描述

3.3 format 格式化函数

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。

  • 基本语法是通过 {} 和 : 来代替以前的 % 。
  • format 函数可以接受不限个参数,位置可以不按顺序。

【例子】

>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'
  • 也可以设置参数:
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
 
# 通过字典设置参数
site = {
    
    "name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
 
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list))  # "0" 是必须的

数字格式化
在这里插入图片描述

^, <, > 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。
+ 表示在正数前显示 +,负数前显示 -; (空格)表示在正数前加空格
b、d、o、x 分别是二进制、十进制、八进制、十六进制。

【例子】

>>> print("{:.2f}".format(3.1415926));
3.14

>>> print ("{} 对应的位置是 {
    
    {0}}".format("runoob"))
runoob 对应的位置是 {
    
    0}

练习题

1、列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:

  1. 在列表的末尾增加元素15
  2. 在列表的中间位置插入元素20
  3. 将列表[2, 5, 6]合并到lst中
  4. 移除列表中索引为3的元素
  5. 翻转列表里的所有元素
  6. 对列表里的元素进行排序,从小到大一次,从大到小一次
>>> lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
>>> lst.append(15)
>>> lst.insert(5,20)
>>> lst.extend([2, 5, 6])
>>> del lst[3]
>>> lst.reverse()
>>> lst.sort()
>>> lst.sort(reverse=True)

2、修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍

简单版:

>>> lst = [1, [4, 6], True]
>>> lst[0] = 2
>>> lst[1][0] = 8
>>> lst[1][1] = 12
>>> print(lst)
# [2, [8, 12], True]

函数版:

def double_list(lst):
    for index, item in enumerate(lst):
        if isinstance(item, bool):
            continue
        if isinstance(item, (int, float)):
            lst[index] *= 2
        if isinstance(item, list):
            double_list(item)


if __name__ == '__main__':
    lst = [1, [4, 6], True]
    double_list(lst)
    print(lst)

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[i1]<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:       
    # your code here

4、元组概念
写出下面代码的执行结果和最终结果的类型

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

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

5、拆包过程是什么?

a, b = 1, 2

上述过程属于拆包吗?
可迭代对象拆包时,怎么赋值给占位符?

6、字符串函数回顾

  • 怎么批量替换字符串中的元素?
  • 怎么把字符串按照空格进行拆分?
  • 怎么去除字符串首位的空格?

7、实现isdigit函数
题目要求
实现函数isdigit, 判断字符串里是否只包含数字0~9

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

8、leetcode 5题 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: “babad”
输出: “bab”
输入: “cbbd”
输出: “bb”

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

参考文献

  • https://github.com/datawhalechina/team-learning-program
  • https://www.cnblogs.com/jingru-QAQ/p/11528711.html
  • 北京大学Python入门课件
  • https://www.runoob.com/python/att-string-format.html

Datawhale

Datawhale是一个专注于数据科学与AI领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。Datawhale以“for the learner,和学习者一起成长”为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。

猜你喜欢

转载自blog.csdn.net/OuDiShenmiss/article/details/107599379