Python 语言-第四章典型数据结构之列表


4.1 列表 (list)

4.1.1 认识列表

  • 为什么需要列表

    • 为了更方便对多个数据进行整体操作
  • 列表相当于其他语言中的数组

  • 存储原理:

    • 列表存储的是对象的“引用“,而非对象本身

    • 内存示意图

      image-20220112162411171

4.1.2 列表的特点

  • 有序
  • 索引映射唯一数据
  • 可以储存重复、任意类型数据
  • 根据动态分配和回收内存

4.1.3 创建列表

  • 使用方括号[]创建:

    • 例如:

      lst1 = [1,2,3,5]
      
  • 使用函数list()创建:

    • 例如:

      lst1 = list([1,4,6])
      
    • 通过这种方法可以将其他可迭代对象类型转换为列表

  • 可通过乘法运算来创建指定长度的列表并对其中的元素进行初始化。

    x=["1"]*10
    print(x)
    
    ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1']
    

4.1.4 基本操作

4.1.4.1 查询操作

4.1.4.1.1 获取列表指定元素索引

  • 使用index()函数通过元素来寻找索引引

  • 如果列表中存在多个相同元素,只会返回相同元素的第一个元素的索引

    • 例如:

      lst1 = [1,2,5,73,7,8,0,2]
      print("查找元素的索引为:",lst1.index(2))
      
      查找元素的索引为: 1
      
  • 如果查询元素不存在于列表,则会出现 ValueError 异常

  • 还可以在指定的 start 和 stop 之间查找元素索引

    • 例如:

      lst1 = [1,2,5,73,7,8,0,2,"Hello",4]
      print("查找元素的索引为:",lst1.index(2,4,9))
      
      查找元素的索引为: 7
      

4.1.4.1.2 获取列表单个元素

  • 使用索引来查找元素

    • 语法格式:

      列表名[索引]
      
      • 例如:

        x=[1,4,56,7]
        print(x[1])
        
        4
        
  • 正向索引从 0 到 N-1

  • 逆向索引从 -N 到 -1

  • 指定的索引不存在,则抛出 IndexError 异常

4.1.4.1.3 获取列表多个元素

  • 使用切片来获取多个元素

  • 切片是原列表片段的拷贝

  • 语法格式:

    列表名[[start]:[stop][:step]]
    
    • step默认为1,默认时可以不写 step

    • start、stop、step 可以省略,但是不可同时省略

      • 例如:

        lst[1:4]
        lst[2::]
        lst[::8]
        

4.1.4.1.4 判断元素是否存在于列表

  • 使用 in|not in进行判断

  • 语法格式:

    元素 in[not in] 列表名
    

4.1.4.1.5 遍历列表中的元素

  • 可以通过while和for循环来实现遍历。通常使用 for 循环

  • 语法格式:

    for 迭代变量 in 列表名:
    	语句块
    

4.1.4.1.6 拆分赋值

  • 用于将一个列表赋予多个变量

  • 例如:

    x,y,z=[1,2,3]
    print(x,y,z)
    
    1 2 3
    
  • 当进行拆分赋值时,当变量个数少于列表元素个数时,可以在变量名前面添加星号"*",这样会将多个元素赋予相应的变量。

    • 例如:

      x,*y,z=[1,2,3,4,5]
      print(x,y,z)
      
      1 [2,3,4,5] 6
      

4.1.4.2 添加操作

  • append():在列表的末尾添加一个元素,等价于执行复合赋值语句 lst += [x]

  • extend():在列表末尾至少添加一个元素

    • 用途:append() 函数在添加元素时,时将元素视为"一个"元素进行添加的,可能会出现列表中还有列表的情况。这时候就可以使用 extend() 函数

    • 例如:

      lst1 = [1,2,3]
      lst2 = [4,5]
      lst1.append(lst2)
      print(lst1)
      
    • [1, 2, 3, [4, 5]]
      
  • insert():在列表任意一个位置添加一个元素

    • 例如:在索引2的位置添加一个元素7

      lst1 = [1,2,3]
      lst1.insert(2,7)
      print(lst1)
      
      [1, 2, 7, 3]
      
    • 如果插入位置大于列表长度,则将元素 x 插入到列表末尾

  • 切片添加:在列表任意位置添加至少一个元素

4.1.4.3 删除操作

  • remove():一次删除一个元素

    • 重复数据只删除第一个

      • 例如:

        lst1 = [1,2,3,2]
        lst1.remove(2)
        print(lst1)
        
        [1, 3, 2]
        
    • 元素不存在时,抛出 ValueError 异常

  • pop():使用索引来删除元素

  • 切片删除:一次至少删除一个元素

    • 实质是将原列表拷贝,再进行切片操作

    • 要想在"原列表"进行操作,则可以使用空列表的方式

      • 例如:

        lst1 = [1,2,3,4,5,6,7]
        lst1[1:3] = []
        print(lst1)
        
        [1, 4, 5, 6, 7]
        
  • clear():清除列表中所有元素,使其变为空列表

  • del:清除列表对象

    • 例如:

      x=[1,2,3,4,5,6]
      del x[3]
      print(x)
      
      [1,2,3,5,6]
      

4.1.4.4 修改操作

  • 为指定的索引的元素赋予新值

    • 例如:

      lst1 = [1,2,3]
      lst1[2] = 10
      print(lst1)
      
      [1, 2, 10]
      
      • 内存示意图:

        image-20220112203642622
  • 为指定的切片赋予一个新值

    • 例如:

      x=[1,2,3,4,5,6]
      x[1:4]=[200,300,400]
      print(x)
      
      [1, 200, 300, 400, 5, 6]
      

4.1.5 排序操作

  • 调用sort()方法:

    • sort() 是列表对象的方法,不会产生新对象

    • 例如:

      lst1 = [10,5,40,30]
      lst1.sort()
      print(lst1)
      
      [5, 10, 30, 40]
      
    • 默认为升序操作,可以设置参数 reverse = True,进行降序排序

  • 调用sorted()方法:

    • sorted() 是 python 内置的方法,会产生新对象,进行操作,原列表不发生改变

4.1.6 列表生成式

  • 列表解析是python迭代机制的一种应用

  • 通过列表解析可以根据已有的列表高效地创建新的列表,因此通常用于创建新的列表

  • 列表解析有两种语法格式:

    [表示列表元素的表达式  for 自定义变量 in 可迭代对象]
    

    或者

    [表示列表元素的表达式 for 自定义变量 in 可迭代对象 if 条件表达式 ]
    
    • ”表示列表元素的表达式 “中通常包含”自定义变量“
  • 例如:列出1~10所有数字的平方

    x=[i*i for i in range(1,11)]
    print(x)
    
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

4.1.7 其他常用函数

  • 内置函数:不止可以应用于列表,还可以应用于其他可迭代类型,例如字符串,元组等

    • 函数 描述
      all(seq) 如果序列 seq 中所有元素为 Ture 或序列自身为空,则返回该函数 Ture,否则返回 False
      any(seq) 如果序列 seq 中任一元素为 Ture 则返回函数 Ture,
      如果序列中 seq 中所有元素为 False 或自身序列为空,则该函数返回False
      len(seq) 返回seq序列长度
      sum(iterable[,start]) 求和,start 用以指定相加的参数,默认为0
      isinstance(object,classinfo) 判断一个对象是否是一个已知的类型,类似 type()。
      object:对象
      classinfo:可以是直接或间接类名、基本类型或者由它们组成的元组。
      返回值的结果是布尔值。如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
  • 列表对象方法:只适用于列表对象的成员方法

    • 函数 描述
      lst.count(x) 返回元素 x 在列表 lst 出现的次数
      lst.serversed(x) 反转列表 lst 中所有元素的位置