Python AI开发(python篇)学习笔记 – 第四章 – 字符串与列表序列详解

第四章:字符串与列表序列

此文章是作者学习ai的完整笔记,在现在ai快速发展的时期,鼓励大家一起学习python!!!

目录

2.6 序列

2.6.1 什么是序列

由一系列字符组成的不可变序列,存储的是字符的编码值;Python的字符串类型为一种可迭代对象

  • 线性结构;
  • 树形结构;
  • 图形结构等;

2.6.2 str字符串序列

1. 字符串拼接运算符
运算符定义 对应重载方法
+字符串拼接 __add__​
*重复拼接对应次数的字符串 __mul__​

📌字符串+ 运算数字类型对象的 + 运算不一样!

  • +使用方法

    • 含义:若干个字符串对象拼接为一个新的字符串对象;

    • 使用方法:

      a = '123'
      b = 'abc'
      print(a+b) # 拼接两个字符串
      
       '123abc' # id值不相同为 新字符串
      
  • *使用方法

    • 含义:在当前字符串对象基础上拼接若干次该字符串

    • 使用方法:

      a = '123'
      print(a * 3) # 将字符串*3次,怕拼接为新的字符串
      
      'abcabcabcabcabc'# id值不相同为 新字符串
      
2. 字符串的成员运算符
运算符定义 
in判断某字符**是否存在于**该字符串,存在,返回**True **
not in 判断某字符**是否不存在于**该字符串,不存在,返回**True **

innot in判断某字符是否存在于字符串序列中

  • 使用方法:

    li = "abc"
    print("a" in a) # 判断"a"是否存在于li字符串序列中
    
    True # 是
    
  • 使用if判断:

    li = "abc"
    if "d" in a:  # 使用if判断
        print("存在")
    elseprint("不存在")
    
    不存在
    
3. 字符串对象构造操作

将传入的任意合法类型的对象构造为一个字符串对象

 print(1+1)      # 默认为int类型,可以直接计算
 print(str(1) + str(1)) # # 将1转化为str类型相加
2
11

4.字符串的索引
  • **len()**计算序列的长度

    • 使用方法

      strs = 'abcde'
      print(len(strs))# 统计字符串长度
      
      
      5 # 长度为5
      
  • 索引

    • 索引是序列类型对象中每一个存在的数据元素的唯一标识符

    • 一个序列的数据元素的索引值总是0开始计算,每个数据元素的索引值+1

    • 使用方法:

      strs = 'abcdefg'
      strs[0]  # 索引序列中的第0位
      
      
      
      a  # 输出strs的第0位值
      
      
      
    • 含义:

      字符串abcde
      索引01234
      0 位为"a"
5. 字符串的索引切片
  • 语法:

    字符串 [ 开始 : 结束 : 步长(可选) ]
    
  • 作用:

    从字符串中截取指定长度的字符串片段;

    步长:默认为1

  • 使用方法1:

    strs = "hello world"
    print(strs[0:4])  # 截取第0到第4位内容
    
    hello
    

    📌所有序列第一位都是以0开始增序

  • 使用方法2:

     strs = "hello world"
     strs[:3]  # 结束为3,表示3前面所有
    
    
    hel
    
  • 使用方法3:

     strs = "hello world"
     strs[2::1]  # 以2开始,没有结尾,步长为1
    
    
    llo world
    
  • 使用方法4:

     strs = "hello world"
     strs[:]  # 所有
    
    
    hello world
    
  • 使用方法5(反向):

     strs = "hello world"
     strs[::-1]  # 反向截取所有
    
    
    dlrow olleh
    
  • 使用方法6(索引修改):

     strs = "hello world"
     strs[5] = "22222" # 替换列表的第5位为22222
     print(strs) 
    
    
    hello22222world
    
6. 字符串常用函数
  1. len():

    • 语法:

      results = len(str)
      
      
    • 作用:

      获取一个字符串的长度,即字符串对象中字符的个数

    • 使用方法:

      strs = "ksnb" 
      print(len(strs)) 
      
      
      4
      
      
  2. max()/min():

    • 语法:

      results = max(str)
      results = min(str)
      
      
    • 作用:

      获取该字符串中值最大/最小的字符

      • 如果是中文、英文、符号字符串,则依据unicode编码获取编码值最大/小的字符;
      • 如果是数值型字符串,则依据字符对应的整型数值对象字面值大小获得最大/小的字符;
    • 使用方法:

      strs = "ksnb" 
      print(max(strs)) 
      
      
      s
      
7. 字符串的遍历

方式一: 直接遍历该字符串(可迭代对象)的字符对象:

strs = "hello world"
for i in strs:
    print(i)

h
e
l
l
o

w
o
r
l
d

方式二: 遍历该字符串(可迭代对象)的索引值:

strs = "hello world"
for i in range(len(strs)):  # 以字符串序列的长度为遍历次数
    print(strs[i])

h
e
l
l
o

w
o
r
l
d
常用方法
方法 描述
string .count(str)返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
string .find(str))检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如   果是返回开始的索引值,否则返回-1
string .islower()如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,   则返回 True,否则返回 False
string .isdigit() 如果 string只包含数字则返回 True 否则返回 False
string .isupper()如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,   则返回 True,否则返回 False
string .join(seq)以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
string .lower()转换 string 中所有大写字符为小写
string .replace(str1, str2)把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
string .split(str=“”)以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔 num+1 个子字符串
string .upper()转换 string 中的小写字母为大写
string .lower()转换 string 中的小写字母为小写

2.6.3 list 序列

1. 定义

一系列数据对象组成的可变序列,存储的是任意类型的对象;Python的列表类型为一种可迭代对象。

  • 语法

    # 1.定义空列表
    list = [] 
    
    # 2.定义有元素列表
    list = [n1,n2,n3,...] 
    
2. 列表对象构造操作
  • 语法:

    # 将字符串转化为列表序列类型
    l = list('12345')  
    print(l)
    
    ["1" ,"2" ,"3" ,"4" ,"5"]
    
  • 2.1列表与字符串

    • 字符串**:因为字符串对象为不可变对象**
      解析**:对象一旦创建则无论对其做拼接、切片等操作时,结果均返回一个新的字符串**对象;
      即:结果对象所赋值的变量的** id 值与原字符串变量的 id值​不同**
    • 列表**:因为列表对象为可变对象**
      解析:对象创建完毕后允许对其内部结构做修改,且这个过程不会产生一个新的列表对象
      **即:对象所赋值的变量的 **id 不发生改变
3. 列表拼接运算符
  • 拼接运算符

    运算符定义
    +列表拼接
    *重复拼接对应次数的列表

    📌注意:列表的 + 运算是多个列表拼接

  • 拼接运算符

    **列表的+**运算符会构造一个新的列表对象

    📌不同对象的id值不同:id(对象)

    • 使用方法:

      li1 = [1, 2, 3]
      li2 = [4, 5, 6]
      print(li1 + li2)
      
      [1, 2, 3, 4, 5, 6]
      
      li1 = [1, 2, 3]
      li2 = [4, 5, 6]
      li3 = li1 + li2)   # 两个列表拼接
      li4 = li3*3        # 拼接3次
      print(li3)
      print(li4)
      
      [1, 2, 3, 4, 5, 6]
      [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
      
      
4. 列表的成员运算符
运算符含义
in 判断某数据对象是否存在于该列表,存在,返回True 
not in 判断某数据对象是否不存在于该列表,不存在,返回True
  • 使用方法:

    li1 = [7, 8, 9]
    print(8 in li1) # 判断8是否存在于li1列表中
    
    True  # 存在
    
5. 列表的索引

序列的长度是指该序列类型对象中数据**元素对象的个数**

li1 = [1, 2, 3, 4]
print(len(li1))
4
  • 列表的索引取值

    li1 = [1, 2, 3, 4]
    value = li1[1]  # 索引li1列表的第1位
    print(value)
    
    2
    
6. 列表的索引切片
  • 语法:

    列表[ 开始值 : 结束值 : 步长(可选)]
    
  • 返回值: 新的列表对象

  • 使用方法1:

    li1 = [1, 2, 3, 4, 5, 6, 7]
    li2 = li1[0:4]  # 截取0~4位
    print(li2)  
    
    
    [1, 2, 3, 4]  # 输出新列表
    
  • 使用方法2:

    li1 = [1, 2, 3, 4, 5, 6, 7]
    print(li1[5:])  # 截取第5位开始后面所有值
    
    [6, 7]  # 输出新列表
    
  • 使用方法3:

    li1 = [1, 2, 3, 4, 5, 6, 7]
    print(li1[:])  # 截取所有
    
    [1, 2, 3, 4, 5, 6, 7]
    
  • 使用方法4:

    li1 = [1, 2, 3, 4, 5, 6, 7]
    print(li1[::-1])  # 取反
    
    [7, 8, 6, 5, 4, 3, 2, 1]
    
  • 使用方法5**(索引修改)****:** ​

    li1 = [1, 2, 3, 4, 5, 6, 7]
    li1[2] = 80  # 将第2位的元素替换为80
    print(li1)
    
    [1, 2, 80, 4, 5, 6, 7]
    
  • max()/min()函数

    # 提取最大值
    li1 = [2, 50, 152, 7]
    print(max(li1))
    
    152
    
    # 提取最小值
    li1 = [2, 50, 152, 7]
    print(min(li1))
    
    2
    
7. 列表的遍历

方式一: 直接遍历该列表(可迭代对象)的数据对象:

li1 = [1, 2, 3, 4, 5]
for i in li1:
    print(i)

1
2
3
4
5

方式二: 遍历该列表(可迭代对象)的索引值:

li1 = [1, 2, 3, 4, 5]
for i in range(len(li1)):  # 以字符串序列的长度为遍历次数
    print(li1[i])

1
2
3
4
5

8. 列表对象常用方法
  • list.append(obj):

    • 作用:向列表的末尾添加一个新的数据对象;

    • obj: 添加的元素

    • 使用方法:

      li1 = ["hello", 20, True, 50]
      print(li1)
      li1.append("BMW")  # 添加BWN字符串
      print(li1)
      
      ["hello", 20, True, 50]
      ["hello", 20, True, 50, "BMW"]
      
  • list.count(obj):

    • 作用:统计某个元素在列表中出现的次数

    • obj: 需要计数元素

    • 使用方法:

      li1 = [20, 30, 20, 20, 30 ,50, 40]
      print(f"20的个数:{li1.count(20)} 个")
      print(f"30的个数:{li1.count(30)} 个")
      print(f"40的个数:{li1.count(40)} 个")
      print(f"50的个数:{li1.count(50)} 个")
      
      
      20的个数:3 个
      30的个数:2 个
      40的个数:1 个
      50的个数:1 个
      
      
  • list.index(obj):

    • 作用:返回某个数据对象的第一个匹配结果索引值;

    • obj: 需要返回的元素

    • 返回值:该数据对象的第一个匹配结果的索引值,int类型;

    • 使用方法:

      li1 = [20, 30, 20, 20, 30 ,50, 40]
      # 该元素在序列中第一次出现的位置的索引值
      print(f"元素“30”的第一个索引位置是:{lis1.index(30)}")
      
      元素“30”的第一个索引位置是:1
      # 列表中第1位是30这个元素在列表中第一次出现的位置
      
  • list.insert(index,obj):

    • 作用:返回某个数据对象的第一个匹配结果索引值;

    • index:索引位,即要插入到哪里,int类型;

    • obj:需要插入的数据对象

    • 使用方法:

      li1 = ["hello", 20, 30, 50]
      # 将li1的第2位后面插入元素“world”
      li1.insert(2, "world")
      print(li1)
      
      ["hello", 20, "world", 30, 50]
      
  • list.pop([index=-1]):

    • 作用:移除列表中某个数据对象,默认移除最后一位

      📌在数据结构与算法的概念中,该方法对应:栈结构末尾出栈操作

    • index:可选,索引位,默认为 -1 ,int类型 ;

    • -1:默认删除列表最后一位元素

    • 返回: 返回删除的元素

    • 使用方法:

      li1 = ["hello", 20, 30, 50]
      li1.pop(2)  # 删除第2位元素
      print(li1)
      
      ["hello", 20, 50]  # 删除30
      
  • list.remove(obj):

    • 作用:移除列表中某个数据对象第一个匹配结果;

    • obj: 列表内需要删除的元素

    • 使用方法:

      li1 = ["hello", 20, 30, 50, 30]
      # 删除li1中的30元素,仅删除第一次出现的地方的元素
      li1.remove(30)
      print(li1)li1 = ["hello", 20, 30, 50]
      li1.(30)  # 删除第2位元素
      print(li1)
      
      ["hello", 20, 50, 30]
      

      📌remove没有返回值,pop有返回值

    • 即:

      • pop:

        # pop
        li1 = ["hello", 20, 30, 50]
        # 变量 v 可以获取pop删除的返回值
        v = li1.pop(2)  # 删除li1[2]元素
        print(li1)
        print(f"删除了:{v}")
        
        ["hello", 20, 50]
        删除了:20
        
      • remove:

        # remove
        li1 = ["hello", 20, 30, 50]
        v = li1.remove(20)  # 删除元素20
        print(li1)
        print(f"删除了:{v}")
        
        ["hello", 30, 50]
        删除了:None  # remove执行后没有返回值,为空
        
        
  • list.reverse():

    • 作用:将列表中的数据对象进行反序

    • 使用方法:

      li1 = ["hello", 20, 30, 50, 30]
      li1.reverse()
      print(li1)
      li1.(30)  # 删除第2位元素
      print(li1)
      
      [30, 50, 30, 20, "hello"]
      
  • list.sort([reverse=False]):

    • 作用:将列表中的数据对象进行排序默认升序排序

    • reverse: 可选,是否降序排序,默认为 False ,代表升序排序;

    • 使用方法:

      li1 = [30, 20, 30, 50, 30]
      li1.sort(True)  # 降序
      print(li1)
      li1.(30)  # 删除第2位元素
      print(li1)
      
      [50, 30, 30, 20]
      
9. 列表推导式
  • 语法:

    # 简化列表对象构造过程
    lists = [关于 循环变量 的表达式 for 循环变量 in 可迭代对象 [if 过滤条件]]
    
  • 使用方法:

    # 2 ** i为每次循环执行的表达式
    # for i in range(1,5) 遍历次数
    # 解析:生成偶数数列
    l1 = [2 ** i for i in range(1,5)]
    
     [2, 4, 8, 16]
    
    # 2 ** 3为每次循环执行的表达式
    # for i in range(5) 遍历次数
    # 解析:生成2 ** 3数列
    l1 = [2 ** 3 for i in range(5)]
    
     [8, 8, 8, 8, 8]
    
  • 列表推导式的嵌套:

    lists = [关于 循环变量1&循环变量2 的表达式 for 循环变量1 in 可迭代对象1 for 循环变量2 in 可迭代对象2]
    
  • 使用方法:

    l = [x ** y for x in range(1,5) for y in range(1,5)]
    print(l)
    
    
    [1, 1, 1, 1, 2, 4, 8, 16, 3, 9, 27, 81, 4, 16, 64, 256]
    

-进阶用法-

  • 推导式嵌套

    # 生成三个(1,10)的列表
    li = [[x for x in range(1,10)] for i in range(3)]
    print(li)
    
    
    [[1, 2, 3, 4, 5, 6, 7, 8, 9],
     [1, 2, 3, 4, 5, 6, 7, 8, 9],
     [1, 2, 3, 4, 5, 6, 7, 8, 9]]
    
  • 序列解包

    # 生成三个(1,6)的列表
    li = [[x for x in range(1,6)] for i in range(3)]
    print(li)
    # 遍历li序列的二层列表每一位元素
    for x,y,z,m,n in li:
        print(x,y,z,m,n)
    
    
    [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
    # 遍历二层列表每一位元素
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    
    • x = 1
    • y = 2
    • z = 3
    • m = 4
    • n = 5
      这种写法在处理结构化数据时非常清晰,比如:
    • 二维坐标点for x, y in points:
    • 键值对列表for key, value in dict_items:
    • 多维数组的固定列数for name, age, city in table_rows:
  • **zip**枚举

    将多个可迭代对象(如列表、元组、字符串)中相同索引位置的元素打包成一个个元组,然后返回一个迭代器。

    使用1: 并行组合

    li1 = [1, 2, 3]
    li2 = [4, 5, 6]
    
    for x,y in zip(li1,li2)
        print(x,y)
    
    
    1 4
    2 5
    3 6
    

    使用2: 并行运算

    a = [1, 2, 3]
    b = [4, 5, 6]
    
    result = [x + y for x, y in zip(a, b)]
    print(result) 
    
    
    [5, 7, 9]
    
    

    使用3: 元组组合

    names = ["Alice", "Bob", "Charlie"]
    scores = [85, 92, 78]
    
    zipped = zip(names, scores)
    print(list(zipped))
    
    
    [('Alice', 85), ('Bob', 92), ('Charlie', 78)]
    
    

    使用4: 格式化字符串拼接

    names = ["Alice", "Bob", "Charlie"]
    ages = [25, 30, 35]
    
    info = [f"{name} is {age} years old." for name, age in zip(names, ages)]
    print(info)
    
    
    ['Alice is 25 years old.', 'Bob is 30 years old.', 'Charlie is 35 years old.']
    
    

    使用5: 条件筛选

    a = [10, 3, 8, 1]
    b = [5, 6, 8, 2]
    
    larger_a = [x for x, y in zip(a, b) if x > y]
    print(larger_a) 
    
    
    [10]
    
    
  • enumerate用法

    它专门用于在遍历可迭代对象(如列表、元组、字符串)时,同时获取元素及其对应的索引(计数),从而避免手动维护计数器变量。

    它返回一个 enumerate 对象,该对象是一个迭代器,每次迭代产生一个 (index, item) 的元组。

    • 案例1:返回索引值元素

      fruits = ["apple", "banana", "cherry"]
      
      for index, fruit in enumerate(fruits):
          print(f"{index}: {fruit}")
      
      
       0: apple
      1: banana
      2: cherry
      
    • 案例2: 自定义起始序号

      fruits = ["apple", "banana", "cherry"]
      
      for idx, fruit in enumerate(fruits, start=1):
          print(f"{idx}. {fruit}")
      
      
      1. apple
      2. banana
      3. cherry
      
    • 案例3: 快速构建带编号的标签

      items = ["A", "B", "C"]
      labeled = [f"{i}: {v}" for i, v in enumerate(items, 1)]
      print(labeled)  
      
      ['1: A', '2: B', '3: C']
      
  • 场景一: 处理多行文本,输出行号

    text = """Hello
    World
    Python"""
    
    for line_no, line in enumerate(text.splitlines(), 1):
        print(f"{line_no:03d}: {line}")
    
    
    001: Hello
    002: World
    003: Python
    
    
  • 场景二: 循环中需要知道位置

    numbers = [2, 4, 6, 8]
    for i, num in enumerate(numbers):
        if num % 4 == 0:
            print(f"Found multiple of 4 at index {i}: {num}")
            numbers[i] = num * 10  # 直接通过索引修改
    
    print(numbers)
    
    
    [2, 40, 6, 80]
    
    
  • 场景三: 同时遍历多个列表并记录步数

    names = ["Alice", "Bob", "Charlie"]
    scores = [85, 92, 78]
    
    for i, (name, score) in enumerate(zip(names, scores), 1):
        print(f"Rank {i}: {name} scored {score}")
    
    
    Rank 1: Alice scored 85
    Rank 2: Bob scored 92
    Rank 3: Charlie scored 78
    
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐