Skip to content

数据存储容器

一种可以容纳多份数据的数据类型 (容器),容纳的每一份数据称之为1个元素,每一个元素都可以是任意类型的数据,如: 字符串、数字、布尔等。

列表(list)

列表是数据容器中的一类,是一次性可以存储多个数据(元素)的

定义

python
#列表名称 = [元素1,元素2,元素3,元素4,元素5,....]

s = [54,23,123,45,78,234]

#创建方式
lst1 = [1, 2, 3]
lst2 = list("abc")           # ['a','b','c']
lst3 = [x**2 for x in range(3)]  # [0,1,4] 推导式
lst4 = []                    # 空列表

#常用操作
lst = [10, 20, 30]
lst[0]          # 10          索引(从0开始,支持负索引)
lst[1:3]        # [20, 30]    切片(左闭右开,返回新列表)
lst[::2]        # [10, 30]    步长
len(lst)        # 3
10 in lst       # True        成员检测
lst[0] = 99     # 修改元素
del lst[1]      # 按索引删除

特点

  • 可变:元素可增删改。
  • 有序:元素按插入顺序存储,支持索引。
  • 可重复:允许重复元素。
  • 异构:可存放任意类型对象

核心方法

方法作用样例
append(x)末尾追加一个元素list.append(10)
insert(i, x)在索引 i 处插入元素list.insert(1,5)
remove(x)移除第一个值等于 x 的元素list.remove(x)
pop(i=-1)移除并返回索引 i 的元素,默认最后一个list.pop()
extend(iter)用可迭代对象扩展列表list.extend()
index(x)返回第一个值为 x 的索引list.index()
count(x)统计 x 出现的次数list.count()
sort(key, reverse)原地排序(稳定)list.sort()
reverse()原地反转列表list.reverse()
clear()清空列表list.clear()
  • sort() 返回 None,内置函数 sorted(lst) 返回新列表。
  • 列表支持 +(拼接)和 (重复)。
  • 列表推导式:[表达式 for 变量 in 可迭代 if 条件] 是快速生成列表的优雅方式。

练习

🤔需求1:将如下多个列表合并为一个列表,并去重重复元素,排好序(升序)后输出到控制台。

python
# 1. 将如下多个列表合并为一个列表,并去重重复元素,排好序(升序)后输出到控制台。
list1 = ['M', 'A', 'C', 'E', 'F', 'G', 'H', 'L', 'N', 'I', 'J', 'K', 'O']
list2 = ['X', 'Z', 'T', 'Y', 'D', 'E', 'F', 'G']
list3 = ['W', 'A', 'S', 'D']

merge_list = [*list1, *list2, *list3]
print("合并后的原始列表为: ", merge_list)

new_list = []

for item in merge_list:
    if item not in new_list:
        new_list.append(item)

print("去重后的列表为: ", new_list)

字符串(str)

字符串是字符的容器,一个字符串中可以存放任意数量的字符,如:“python”

特性

  • 不可变:一旦创建,内容不能修改。
  • 有序:字符序列,支持索引和切片。
  • Unicode:Python 3 字符串是 Unicode 码点序列。

创建方式

python
s1 = "hello"
s2 = 'world'
s3 = """多行
文本"""
s4 = str(123)         # '123'
s5 = ''               # 空字符串

常用操作与关键方法(均为返回新字符串,原字符串不变)

方法/操作作用
s[i]取索引 i 的字符 (1 为最后一个)
s[start:stop:step]切片
len(s)字符长度
s.super()/s,lower()全大写 / 全小写
s.strip(chars)去除两端指定字符(默认空白)
s.split(sep)按分隔符分割成列表
s.join(iter)用字符串连接可迭代对象中的元素(如 '-'.join(['a','b']) → 'a-b'
s.replace(old, new)替换子串(不修改原串)
s.find(sub)返回子串首次出现的索引,未找到返回 1
s.startswith()检查字符串以指定字串开头,返回布尔值
s.endswith()检查字符串以指定字串结尾,返回布尔值
  • 不支持直接通过索引赋值(如 s[0]='H' 会报错),需构建新串。
  • 成员检查:'ell' in "hello" → True
  • 遍历字符串即为遍历每个字符

练习

🤔输入一个字符串, 判断该字符串是否是回文(两边对称)

python
# 1. 输入一个字符串, 判断该字符串是否是回文(两边对称) 。  "黄山落叶松叶落山黄"  "上海自来水来自海上"
s = input("请输入一个字符串: ")

# 方式一(双指针法): 思路是从两边向中间遍历, 基于索引获取两边字符对比, 如果两边的字符不相等, 则不是回文, 否则是回文。
left = 0 # 左索引
right = len(s) - 1 # 右索引
flag = True

while left < right:
    if s[left] != s[right]:
        flag = False
        break
    left += 1
    right -= 1

if flag:
    print(f"'{s}' 是回文")
else:
    print(f"'{s}' 不是回文")

# 方式二:
if s == s[::-1]:
    print(f"'{s}' 是回文")
else:
    print(f"'{s}' 不是回文")

元组(tuple)

元祖是不可变的序列,类似于列表,但创建后不能修改

定义

python
# 定义元祖
元祖名称 = (元素1,元素2,...)

# 定义空元祖
元祖名称 = ()
元祖名称 = tuple()

#创建元祖

t1 = (1, 2, 3)
t2 = 1, 2, 3          # 括号可省略
t3 = tuple("abc")     # ('a','b','c')
t4 = ()               # 空元组
t5 = (5,)             # 单元素元组必须有逗号

#常用操作

t = (10, 20, 30)
t[0]           # 10
t[1:3]         # (20, 30)
len(t)         # 3
20 in t        # True
t.count(10)    # 1
t.index(20)    # 1
  • 支持 +、、成员检测、循环遍历。
  • 常用于函数多返回值:return a, b 实际上返回一个元组。
  • 序列解包:x, y, z = (1, 2, 3)

特点

  • 不可变:元素不能修改、增加或删除。
  • 有序:支持索引、切片。
  • 可重复,可存放异构数据。
  • 常作为不可变列表使用,可散列(元素全可散列时),因此可用于字典的键或集合的元素。

元祖-组包与解包

注意: 在元祖解包时,* 表示收集剩余的所有元素,允许我们处理不确定数量的元素

集合(set)

集合(set)是一种无序的,不可重复,可修改的数据容器

创建方式

python
s1 = {1, 2, 3}
s2 = set([1, 2, 2, 3])   # {1,2,3} 自动去重
s3 = set()                 # 空集合(注意 {} 是空字典)

特性

  • 可变set 内置类型)或 不可变frozenset)。
  • 无序:元素没有固定顺序(不可索引)。
  • 唯一性:自动去重,不允许重复元素。
  • 元素必须为可散列(不可变类型,如数、字符串、元组等)。

集合运算

操作示例(a = {1,2}, b = {2,3}说明
ab
a & b交集
a - b差集(a有b无)
a ^ b对称差集(不同时属于两者)

字典(dict)

Python中的字典,里面存储的是键值对(key :value)类型的数据,可以根据key找到对应的值

创建方式

python
d1 = {'a': 1, 'b': 2}
d2 = dict(a=1, b=2)
d3 = dict([('a',1), ('b',2)])
d4 = {}                # 空字典
d5 = {x: x**2 for x in range(3)}  # 字典推导式 {0:0, 1:1, 2:4}

特性

  • 可变:可增删改键值对。
  • 键唯一,且必须为可散列类型(字符串、数字、含不可变元素的元组等)。
  • 可以是任意类型。
  • 自 Python 3.7 起保留插入顺序(官方保证)

综合案例

练习

🤔

开发一个教务管理系统,在该系统中可以维护和管理学员的成绩信息,具体需求如下:

  1. 添加学生信息:根据提示录入学生姓名、语文、数学、英语成绩,录入完成保存到系统中。
  2. 修改学生信息:要求输入要修改的学生姓名,然后再提示输入语文、数学、英语成绩,输入完成后修改学员信息。
  3. 删除学生信息:要求输入要删除的学生姓名,根据姓名删除学生信息。
  4. 查询学生信息:要求输入要查询的学生姓名,根据姓名查询学生信息并输出。
  5. 列出所有学生:遍历所有学生信息并输出。
  6. 统计班级成绩:统计班级语文、数学、英语成绩的最高分、最低分、平均分,以及语文、数学、英语最高分和最低分的学员姓名。
  7. 退出系统。
python
"""
    案例:
    开发一个教务管理系统,在该系统中可以维护和管理学员的成绩信息,具体需求如下:
        1. 添加学生信息:根据提示录入学生姓名、语文、数学、英语成绩,录入完成保存到系统中。
        2. 修改学生信息:要求输入要修改的学生姓名,然后再提示输入语文、数学、英语成绩,输入完成后修改学员信息。
        3. 删除学生信息:要求输入要删除的学生姓名,根据姓名删除学生信息。
        4. 查询学生信息:要求输入要查询的学生姓名,根据姓名查询学生信息并输出。
        5. 列出所有学生:遍历所有学生信息并输出。
        6. 统计班级成绩:统计班级语文、数学、英语成绩的最高分、最低分、平均分,以及语文、数学、英语最高分和最低分的学员姓名。
        7. 退出系统。
"""

menu = """
# # # # # # # # # # # # # # # # # # # # # # # # # # 【菜单】 # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#  1. 添加学生信息   2. 修改学生信息   3. 删除学生信息   4. 查询学生信息   5. 列出所有学生   6. 统计班级成绩   7. 退出系统       #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
"""
print("欢迎使用教务管理系统 ~")

student_scores = {}

while True:
    # 1. 制作菜单
    print(menu)

    # 2. 执行的具体操作
    choice = input("请选择要执行的操作(1-7): ")
    match choice:
        case "1":  # 添加学生信息
            student_name = input("请输入学生姓名: ")
            chinese_score = float(input("请输入语文成绩: "))
            math_score = float(input("请输入数学成绩: "))
            english_score = float(input("请输入英语成绩: "))

            # 如果学生存在, 则不执行添加, 提示信息
            if student_name in student_scores:
                print("该学生已存在, 请重新选择 ~")
            else:
                student_scores[student_name] = {"chinese": chinese_score, "math": math_score, "english": english_score}
                print("学生信息添加完毕 ~")
        case "2":  # 修改学生信息
            student_name = input("请输入要修改的学生姓名: ")
            # 如果学生不存在, 则提示错误信息, 重新选择
            if student_name not in student_scores:
                print("该学生不存在, 请重新选择 ~")
                continue

            chinese_score = float(input("请输入语文成绩: "))
            math_score = float(input("请输入数学成绩: "))
            english_score = float(input("请输入英语成绩: "))
            student_scores[student_name] = {"chinese": chinese_score, "math": math_score, "english": english_score}
            print("学生信息修改完毕 ~")
        case "3":  # 删除学生信息
            student_name = input("请输入要删除的学生姓名: ")

            # 如果学生不存在, 则提示错误信息, 重新选择
            if student_name not in student_scores:
                print("该学生不存在, 请重新选择 ~")
            else:
                del student_scores[student_name]
                print("学生信息删除完毕 ~")
        case "4":  # 查询学生信息
            student_name = input("请输入要查询的学生姓名: ")

            # 如果学生不存在, 则提示错误信息
            if student_name not in student_scores:
                print("该学生不存在, 请重新选择 ~")
            else:
                student_info = student_scores[student_name]
                print(f"学生姓名: {student_name}, 语文成绩: {student_info['chinese']}, 数学成绩: {student_info['math']}, 英语成绩: {student_info['english']}")
        case "5":  # 列出所有学生
            for student_name in student_scores.keys():
                student_info = student_scores[student_name]
                print(f"学生姓名: {student_name}, 语文成绩: {student_info['chinese']}, 数学成绩: {student_info['math']}, 英语成绩: {student_info['english']}")
        case "6":  # 统计班级成绩
            if not student_scores:
                print("系统中暂无学生信息,请先添加学生 ~")
                continue

            # 初始化统计变量
            chinese_scores = []
            math_scores = []
            english_scores = []

            # 收集所有成绩
            for student_name, scores in student_scores.items():
                chinese_scores.append(scores['chinese'])
                math_scores.append(scores['math'])
                english_scores.append(scores['english'])

            # 计算最高分、最低分、平均分
            chinese_max = max(chinese_scores)
            chinese_min = min(chinese_scores)
            chinese_avg = sum(chinese_scores) / len(chinese_scores)

            math_max = max(math_scores)
            math_min = min(math_scores)
            math_avg = sum(math_scores) / len(math_scores)

            english_max = max(english_scores)
            english_min = min(english_scores)
            english_avg = sum(english_scores) / len(english_scores)

            # 找出最高分和最低分的学生
            chinese_max_students = [name for name, scores in student_scores.items() if scores['chinese'] == chinese_max]
            chinese_min_students = [name for name, scores in student_scores.items() if scores['chinese'] == chinese_min]

            math_max_students = [name for name, scores in student_scores.items() if scores['math'] == math_max]
            math_min_students = [name for name, scores in student_scores.items() if scores['math'] == math_min]

            english_max_students = [name for name, scores in student_scores.items() if scores['english'] == english_max]
            english_min_students = [name for name, scores in student_scores.items() if scores['english'] == english_min]

            # 输出统计结果
            print("===== 班级成绩统计 =====")
            print(f"语文 - 最高分: {chinese_max}, 最低分: {chinese_min}, 平均分: {chinese_avg:.2f}")
            print(f"     最高分学生: {chinese_max_students}")
            print(f"     最低分学生: {chinese_min_students}")

            print(f"数学 - 最高分: {math_max}, 最低分: {math_min}, 平均分: {math_avg:.2f}")
            print(f"     最高分学生: {math_max_students}")
            print(f"     最低分学生: {math_min_students}")

            print(f"英语 - 最高分: {english_max}, 最低分: {english_min}, 平均分: {english_avg:.2f}")
            print(f"     最高分学生: {english_max_students}")
            print(f"     最低分学生: {english_min_students}")
            print("========================")
        case "7":  # 退出系统
            print("Bye ~")
            break
        case _:  # 匹配其他所有情况
            print("非法操作, 不支持!!!")