Python启航—复杂数据类型

1 阅读8分钟

列表类型

  • 数组

    • 在Python中,实际上并没有一个专门的“数组”数据类型
    • 通常是指NumPy库中的ndarray(N维数组)对象
    • 而Python的标准数据类型中,有一个“列表”(list),它可以用来存储一系列有序的元素
      # 数组
      import numpy as np
      
      arr1 = np.array([1, 2, 3, 4, 5])
      arr2 = np.array(["a", "b", "c"])
      print(arr1, type(arr1))
      print(arr2, type(arr2))
      
      [1 2 3 4 5] <class 'numpy.ndarray'>
      ['a' 'b' 'c'] <class 'numpy.ndarray'>
      
  • 列表

    • 定义:
      • 列表(List)是Python中非常常用的一种数据结构
      • 它可以包含任意类型的数据项,如整数、浮点数、字符串、其他列表等,并且列表中的数据项之间是有序的
    • 特性:
      • 有序:列表中的元素具有明确的位置
      • 可变:列表创建后,可以修改其中的元素
      • 可重复:同一个元素可以在列表中出现多次
  • 创建列表

    • 使用 [] 创建
      # 通过[]创建列表
      list1 = [1, 2, 3, 4, 5]
      list2 = ["a", "b", "c"]
      list3 = [1, 0.1, "a", True, [1, 2, 3]]
      print(list1, type(list1))
      print(list2, type(list2))
      print(list3, type(list3))
      
      [1, 2, 3, 4, 5] <class 'list'>
      ['a', 'b', 'c'] <class 'list'>
      [1, 0.1, 'a', True, [1, 2, 3]] <class 'list'>
      
    • 使用list()函数创建
      # 通过list函数
      list4 = list(range(5))
      list5 = list("hello")
      print(list4, type(list4))
      print(list5, type(list5))
      
      [0, 1, 2, 3, 4] <class 'list'>
      ['h', 'e', 'l', 'l', 'o'] <class 'list'>
      
  • 索引和切片

    # 索引和切片
    list6 = list1[1:3]
    print(list6)
    list7 = list1[::2]
    print(list7)
    
    [2, 3]
    [1, 3, 5]
    
  • 列表常用方法

    方法含义
    append在列表末尾添加元素(参数为值,改变原列表)
    insert在指定索引前插入元素(参数为索引和值,改变原列表)
    remove删除列表中首次出现的指定元素(参数为值,改变原列表)
    pop删除并返回列表中指定索引的元素,如果不指定位置则默认删除最后一个元素(改变原列表)
    extend将一个列表的所有元素添加到另一个列表的末尾(参数为要添加的列表,改变原列表)
    index返回指定元素在列表中的第一个出现的索引位置
    count返回指定元素在列表中出现的次数
    sort对列表中的元素进行排序(改变原列表)
    sorted(内置函数)对列表中的元素进行排序(不改变原列表)
    # 方法
    numbers = [1, 3, 3, 4, 4, 5]
    print(numbers)
    numbers.append(6)
    print(numbers)
    numbers.insert(1, 2)
    print(numbers)
    numbers.remove(3)
    print(numbers)
    numbers.pop(4)
    print(numbers)
    numbers.pop()
    print(numbers)
    numbers.extend([6, 7, 8, 10, 9])
    print(numbers)
    numbers.sort()
    print(numbers)
    print(sorted(numbers))  # 内置函数,不改变原列表
    print(numbers.index(1))
    print(numbers.count(1))
    
    [1, 3, 3, 4, 4, 5]
    [1, 3, 3, 4, 4, 5, 6]
    [1, 2, 3, 3, 4, 4, 5, 6]
    [1, 2, 3, 4, 4, 5, 6]
    [1, 2, 3, 4, 5, 6]
    [1, 2, 3, 4, 5]
    [1, 2, 3, 4, 5, 6, 7, 8, 10, 9]
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    0
    1
    

第3集 字典类型

  • 含义

    • 字典是一种可变、无序且键值对(key-value)的数据结构
  • 创建

    • 字典是通过大括号 {} 创建的,键值对之间用逗号 , 分隔
    • 键(Key)是唯一的,通常是不可变类型(如整数、浮点数、字符串、元组),值(Value)可以是任意类型
  • 访问字典值

    • 通过键来访问字典中的值
  • 修改字典的值

    • 可以直接通过键来修改字典中的值
  • 添加字典的元素

    • 如果键不存在,可以直接添加键值对
  • 删除字典元素

    • 使用 del 或者 pop() 删除字典元素
    • popitem() 按照插入顺序删除,旧版本3.7以前是随机删除并返回一个元素(键值对)
    • clear() 清空字典
  • 例:

    # 字典
    person1 = {
        "name": "Steven Wong",
        "age": 29,
    }
    print(person1)
    print(person1["name"])
    print(person1.get("age", "Not Found"))
    print(person1.get("sex", "Not Found"))
    person1["age"] = 30
    person1["sex"] = "男"
    print(person1)
    del person1["sex"]
    print(person1)
    print(person1.pop("age"))  # 返回元素的值(30print(person1)
    # person1.popitem()  # 按照插入顺序删除,旧版本3.7以前是随机删除并返回一个元素(键值对)
    person1.clear()
    print(person1)
    
    {'name': 'Steven Wong', 'age': 29}
    Steven Wong
    29
    Not Found
    {'name': 'Steven Wong', 'age': 30, 'sex': '男'}
    {'name': 'Steven Wong', 'age': 30}
    30
    {'name': 'Steven Wong'}
    {}
    
  • 常用方法

    • keys():返回字典中所有的键(输出的是视图对象,并不是列表)
    • values():返回字典中所有的值(输出的是视图对象,并不是列表)
    • items():返回字典中所有的键值对(输出的是视图对象,并不是列表)
    • update():使用另一个字典的键值对更新当前字典
      # 方法
      person2 = {
          "name": "Steven Wong",
          "age": 29,
      }
      print(person2.keys())
      print(list(person2.keys()))
      print(person2.values())
      print(list(person2.values()))
      print(person2.items())
      print(list(person2.items()))
      person2.update({"age": 30, "sex": "男"})
      print(person2)
      
      dict_keys(['name', 'age'])
      ['name', 'age']
      dict_values(['Steven Wong', 29])
      ['Steven Wong', 29]
      dict_items([('name', 'Steven Wong'), ('age', 29)])
      [('name', 'Steven Wong'), ('age', 29)]
      {'name': 'Steven Wong', 'age': 30, 'sex': '男'}
      
  • 字典推导式

    • 类似于列表推导式,可以快速生成字典
      # 字典推导式
      keys = ["name", "age"]
      values = ["Steven Wong", 29]
      print({k: v for k, v in zip(keys, values)})
      
      {'name': 'Steven Wong', 'age': 29}
      
      for k, v in zip(keys, values):这是一个for循环,它解包遍历zip(keys, values)产生的迭代器 [('a', 1), ('b', 2), ('c', 3)]
      在每次迭代中,k取元组的第一个元素(即来自keys),v取元组的第二个元素(即来自values)
      
      {k: v...}:对于每次迭代,这表示一个新的键值对,其中k是键,v是值,包裹在大括号中,表示正在生成一个新的字典
      

元组类型

  • 定义

    • 元组是一个不可变的序列类型,用于存储一系列按特定顺序排列的元素
    • 一旦元组被创建,它的内容就不能被修改,也就是说,你不能添加、删除或更改元组中的元素
  • 创建

    • 使用圆括号()将元素括起来,元素之间用逗号,分隔
  • 特性

    • 不可变性:元组一旦创建,其元素就不能被修改
    • 有序性:元组中的元素按照定义的顺序进行排列
    • 可索引:和列表一样,元组也可以通过索引访问元素
    • 可切片:可以使用切片操作获取元组中的一部分元素
    • 元组可以包括列表(可变的),外部改变了列表,但是元组的结构不变
      # 元组
      tuple1 = (1, 0.1, "a", True, [1, 2, 3])
      tuple2 = (1,)  # 只有一个元素的元组
      print(tuple1)
      print(tuple2)
      print(tuple1[0])
      print(tuple1[1:3])
      tuple1[4].pop()
      print(tuple1)
      
      (1, 0.1, 'a', True, [1, 2, 3])
      (1,)
      1
      (0.1, 'a')
      (1, 0.1, 'a', True, [1, 2])
      
  • 常用方法

    • count(value):返回元组中指定值出现的次数
    • index(value):返回指定值在元组中第一次出现的索引,如果未找到则抛出异常
  • 操作

    • 拼接
    • 重复
    • 判断存在
    • 元组长度
    • 解包
    • 比较
    • 通过重新赋值创建新的元组
    • 元组作为字典键(由于元组不可变性,可以作为字典的键,而列表等可变类型则不能)
      tuple1 = (1, 0.1, 'a', True, [1, 2])
      # 方法操作
      print(tuple1.count(1))  # True
      print(tuple1.index(True))
      print(tuple1 + tuple2)
      print(tuple1 * 2)
      print(1 in tuple1)
      print(0 in tuple1)
      print(len(tuple1))
      a, b, c, d, e = tuple1
      print(a, b, c, d, e)
      print(tuple1 == tuple2)
      tuple1 = tuple1 + tuple2
      print(tuple1)
      dict1 = {(1, 2): "a", (3, 4): "b"}
      print(dict1[(1, 2)])
      print(dict1[(3, 4)])
      
      2
      0
      (1, 0.1, 'a', True, [1, 2], 1)
      (1, 0.1, 'a', True, [1, 2], 1, 0.1, 'a', True, [1, 2])
      True
      False
      5
      1 0.1 a True [1, 2]
      False
      (1, 0.1, 'a', True, [1, 2], 1)
      a
      b
      

集合类型

  • 定义

    • 集合是一个无序且不包含重复元素的数据类型
  • 特性

    • 无序性:集合中的元素没有特定的顺序
    • 互异性:集合中的元素是唯一的,不重复
  • 创建

    • 使用大括号 {} (不能创建空集合)或 set() 函数来创建集合

      set1 = {1, 2, 3, 4, 5}
      set2 = {3, 4, 5, 6, 7}
      # set1 = set([1, 2, 3, 4, 5])
      print(set1)
      
      {1, 2, 3, 4, 5}
      
    • 利用集合去重

      list1 = [1, 2, 3, 3, 4, 5]
      print(list(set(list1)))  # 去重
      
      [1, 2, 3, 4, 5]
      
  • 基本操作

    • 添加元素:使用 add() 方法或更新操作符 |=
    • 删除元素:使用 remove()discard() 方法,或使用 pop() 移除并返回随机元素(如果集合非空)
    • 判断元素是否存在:使用 in 关键字
    • 集合的长度:使用 len() 函数re
      set1 = {1, 2, 3, 4, 5}
      set1.add(6)
      print(set1)
      set1.remove(6)
      print(set1)
      print(1 in set1)
      print(len(set1))
      
      {1, 2, 3, 4, 5, 6}
      {1, 2, 3, 4, 5}
      True
      5
      
  • 运算

    • 交集:使用 & 运算符方法
    • 并集:使用 | 运算符方法
    • 差集:使用 - 运算方法
    • 对称差集:使用 ^ 运算符方法
      set1 = {1, 2, 3, 4, 5}
      set2 = {3, 4, 5, 6, 7}
      # 运算
      print(set1 & set2)  # 交集
      print(set1 | set2)  # 并集
      print(set1 - set2)  # 差集
      print(set1 ^ set2)  # 对称差集
      
      {3, 4, 5}
      {1, 2, 3, 4, 5, 6, 7}
      {1, 2}
      {1, 2, 6, 7}
      
  • 方法

    • clear():清空集合
    • copy():返回集合的浅拷贝
      set1 = {1, 2, 3, 4, 5}
      set2 = {3, 4, 5, 6, 7}
      # 方法
      set1.clear()
      print(set1)
      set3 = set2.copy()  # 浅拷贝
      print(set3)
      
      set()
      {3, 4, 5, 6, 7}