前言

在 Python 编程中,组合数据类型是处理批量数据的核心基础,它能把多个不同类型的数据打包在一起,灵活存储与操作。

第 4 章重点讲解三大组合类型:

  • 列表 list:最常用、可修改
  • 元组 tuple:不可修改、更安全
  • 字典 dict:键值对、无序、查询快

本文逐点拆解,代码完整、注释详细、案例实战,帮你彻底吃透组合数据类型!


Python 列表类型(List)从入门到精通详解

本文将结合完整代码示例,系统讲解 Python 中列表(List)的核心知识点,包括列表的定义、元素获取、循环访问、常用函数与方法等,适合 Python 初学者快速掌握列表的核心用法。


1 列表类型的介绍

列表是 Python 中最常用的组合数据类型之一,它可以将多种不同类型的元素按顺序组合在一起,用方括号[]包裹,元素之间用英文逗号分隔。列表中的元素可以是数值、字符串、列表、元组、字典等任意数据类型,当列表中嵌套其他列表时,被嵌套的列表称为子列表。

示例代码:创建基础列表

python

# 定义一个包含数值和字符串的混合类型列表
ls = [1, 2, 'Python']
# 输出列表
print(ls)

plaintext

[1, 2, 'Python']

输出的内容与列表定义的内容、元素顺序完全一致。


2 获取列表元素

列表中的元素是有序的,支持通过索引切片两种方式获取元素,与字符串的索引、切片原理基本一致,核心规则如下:

  1. 列表从左到右索引从 0 开始递增,索引为 0 表示第 1 个元素;
  2. 支持反向索引,从右到左索引从 - 1 开始递减,-1 表示最后一个元素;
  3. 索引获取的元素数据类型与原元素一致,切片获取的结果始终是一个新列表;
  4. 列表中的子列表本身也是一个元素,可通过多层索引获取子列表中的元素。

2.1 索引获取列表元素

python

# 定义变量a
a = '学习'
# 创建包含数值、字符串、子列表、变量的列表
ls = [12, '12', ['p', 't'], a]
# 获取索引为0、2和-3的元素
print(ls[0], ls[2], ls[-3])

plaintext

12 ['p', 't'] 12
  • ls[0]:获取列表第 1 个元素,即数值12
  • ls[2]:获取列表第 3 个元素,即子列表['p', 't']
  • ls[-3]:从列表尾部向前数第 3 个元素,即字符串'12'

2.2 获取嵌套列表中的元素

当列表中包含子列表时,可通过列表名[外层索引][内层索引]的方式获取子列表中的元素。

python

# 定义包含多个子列表的列表
ls = ['t', ['t', 'f'], [12, 34, 7], 'Python']
# 分别获取不同层级的元素
print(ls[0][1], ls[1][1], ls[2][2], ls[3][4])

plaintext

t f 7 o
  • ls[0][1]:先获取索引为 0 的子列表't'(字符串),再取其索引为 1 的字符,即t
  • ls[1][1]:先获取索引为 1 的子列表['t', 'f'],再取其索引为 1 的元素,即'f'
  • ls[2][2]:先获取索引为 2 的子列表[12,34,7],再取其索引为 2 的元素,即7
  • ls[3][4]:先获取索引为 3 的字符串'Python',再取其索引为 4 的字符,即'o'

2.3 切片获取列表元素

切片的语法为列表名[起始索引:结束索引:步长],遵循 “左闭右开” 规则,即包含起始索引的元素,不包含结束索引的元素。

python

a = '学习'
ls = [12, '12', ['p', 't'], a]
# 获取索引0~2(不包含2)的元素,索引-3~-1(不包含-1)的元素
print(ls[0:2], ls[-3:-1])

plaintext

[12, '12'] ['12', ['p', 't']]

切片返回的结果始终是一个列表,因此输出结果外层带有方括号。

2.4 多层嵌套列表的索引方法

当列表包含多层嵌套时,可通过列表名[索引1][索引2][索引3]...的方式逐层获取最内层元素。

python

# 定义多层嵌套列表
ls = [12, ['le', [3, 4, 'hello'], 19], 'py']
# 获取多层嵌套的元素
print(ls[1][1][2])

plaintext

hello

执行步骤:

  1. 先获取ls[1],即子列表['le', [3, 4, 'hello'], 19]
  2. 再获取ls[1][1],即子列表[3, 4, 'hello']
  3. 最后获取ls[1][1][2],即字符串'hello'

3 循环访问列表的元素

Python 中的for循环可以直接遍历列表,每次循环会将列表中的一个元素依次赋值给循环变量,同时可通过len()函数获取列表的长度。

3.1 for 循环遍历列表

python

# 定义包含子列表和字符串的列表
ls = [['t', 'f'], [12, 34, 7], 'Python']
# 循环遍历列表中的每个元素
for i in ls:
    print(i)

plaintext

['t', 'f']
[12, 34, 7]
Python

循环会依次输出列表中的每一个元素,包括子列表和字符串。

3.2 len () 函数获取列表长度

len()函数仅统计列表顶层的元素个数,不会递归统计子列表中的元素。

python

ls = [['t', 'f'], [12, 34, 7], 'Python']
# 获取列表的长度
print(len(ls))

plaintext

3

列表ls的顶层有 3 个元素,因此长度为 3。


4 列表类型的函数

Python 中可以使用list()函数将其他可迭代对象(如字符串)转换为列表,但数值类型无法直接转换为列表,会抛出TypeError异常。

示例代码:list () 函数的使用

python

# 定义字符串变量和数值变量
a = "你好,办公自动化"
b = 12
# 将字符串转换为列表
print(list(a))
# 尝试将数值转换为列表(会报错)
# print(list(b))

plaintext

['你', '好', ',', '办', '公', '自', '动', '化']

字符串转换为列表时,每个字符会被作为单独的元素存入列表;而数值是不可迭代对象,直接使用list(b)会报错TypeError: 'int' object is not iterable


5 列表类型的常用方法

Python 为列表提供了丰富的内置方法,可通过dir(list)查看所有可用方法,以下是最常用的 10 种方法详解:

5.1 append (参数) 方法

功能:在列表的末尾添加一个新元素,直接修改原列表,无返回值。

python

# 定义列表
ls = ['奶茶', '大盘鸡']
# 在列表末尾添加元素
ls.append('冰淇淋')
# 输出修改后的列表
print(ls)

plaintext

['奶茶', '大盘鸡', '冰淇淋']

5.2 clear () 方法

功能:清空列表中的所有元素,使列表变为空列表,直接修改原列表,无返回值。

python

ls = ['奶茶', '大盘鸡']
# 清空列表
ls.clear()
print(ls)

plaintext

[]

5.3 copy () 方法

功能:复制一个新的列表(浅拷贝),原列表和新列表相互独立,修改其中一个不会影响另一个;而直接赋值的列表会共享内存空间,修改其中一个会影响另一个。

python

ls = ['奶茶', '大盘鸡']
# 使用copy()方法复制列表
ls_new1 = ls.copy()
# 直接赋值列表
ls_new2 = ls
# 清空原列表
ls.clear()
# 输出三个列表
print(ls, ls_new1, ls_new2)

plaintext

[] ['奶茶', '大盘鸡'] []
  • ls_new1ls的副本,原列表清空后不受影响;
  • ls_new2ls共享内存,原列表清空后也变为空列表。

5.4 count (参数) 方法

功能:统计指定元素在列表中出现的次数。

python

ls = ['奶茶', '大盘鸡', '大盘鸡', '奶茶', '奶茶']
# 统计'奶茶'在列表中出现的次数
ls_count = ls.count('奶茶')
print(ls_count)

plaintext

3

5.5 index (参数) 方法

功能:获取指定元素在列表中第一次出现的索引位置,若元素不存在会抛出ValueError异常。

运行

ls = ['奶茶', '大盘鸡', '冰淇淋', '榴莲']
# 获取'冰淇淋'的索引
ls_index = ls.index('冰淇淋')
print(ls_index)

plaintext

2

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

5.6 insert (参数 1, 参数 2) 方法

功能:在指定索引位置插入一个新元素,原索引位置及之后的元素会自动向后移动一位。

python

ls = ['奶茶', '大盘鸡', '冰淇淋', '榴莲']
# 在索引为2的位置插入'蛋糕'
ls.insert(2, '蛋糕')
print(ls)

plaintext

['奶茶', '大盘鸡', '蛋糕', '冰淇淋', '榴莲']

5.7 pop (参数) 方法

功能:删除指定索引位置的元素,并返回被删除的元素;若不指定索引,默认删除列表最后一个元素。

python

ls = ['奶茶', '大盘鸡', '冰淇淋', '榴莲']
# 删除索引为2的元素,并接收被删除的元素
ls_pop = ls.pop(2)
# 输出被删除的元素和修改后的列表
print(ls_pop, ls)

plaintext

冰淇淋 ['奶茶', '大盘鸡', '榴莲']

5.8 remove (参数) 方法

功能:删除列表中第一次出现的指定元素,无返回值;若元素不存在会抛出ValueError异常。

python

ls = ['奶茶', '大盘鸡', '冰淇淋', '榴莲']
# 删除列表中第一次出现的'大盘鸡'
ls_remove = ls.remove('大盘鸡')
print(ls_remove, ls)

plaintext

None ['奶茶', '冰淇淋', '榴莲']

remove()方法执行后无返回值,因此ls_remove的值为None

5.9 reverse () 方法

功能:将列表中的元素顺序反转,直接修改原列表,无返回值。

python

ls = ['奶茶', '大盘鸡', '冰淇淋', '榴莲']
# 反转列表
ls_reverse = ls.reverse()
print(ls_reverse, ls)

plaintext

None ['榴莲', '冰淇淋', '大盘鸡', '奶茶']

5.10 sort (参数) 方法(重要)

功能:对列表中的元素进行排序,直接修改原列表,无返回值。

  • 默认按升序排序,可通过reverse=True参数实现降序排序;
  • 数字按数值大小排序,字符串按 Unicode 编码顺序排序(汉字按拼音顺序排序)。

python

# 定义包含汉字的列表和数字列表
ls_1 = ['奶茶', '大盘鸡', '冰淇淋', '榴莲']
ls_2 = [3, 2, 6, 7, 3, 1]
# 对ls_1进行升序排序(默认)
ls_sort_1 = ls_1.sort()
# 对ls_2进行降序排序
ls_2.sort(reverse=True)
# 输出结果
print(ls_sort_1, ls_1, ls_2)

plaintext

None ['冰淇淋', '大盘鸡', '奶茶', '榴莲'] [7, 6, 3, 3, 2, 1]

sort()方法直接修改原列表,因此ls_sort_1的值为None


Python 元组类型详解:不可变序列的特性与使用

1 元组的基本概念

在 Python 中,元组(tuple)是一种与列表相似的序列数据类型,它和列表的核心区别在于:元组是不可变的,一旦创建就不能对其中的元素进行删除、添加、修改、反转等操作。

元组的创建方式非常简单,只要把元素用圆括号 () 括起来即可,其通用形式如下:

python

(元素1, 元素2, 元素3, ...)

元组中的每个元素可以是不同的数据类型,例如整数、字符串、列表,甚至是另一个元组,这为数据存储提供了很高的灵活性。


2 元组的核心特性:不可修改性

元组最关键的特性是不支持元素的修改操作,这也导致元组中可用的函数和方法远少于列表。

2.1 尝试修改元组的后果

如果我们尝试对元组执行修改操作(比如用索引赋值),Python 会直接抛出 TypeError 错误,提示元组不支持元素赋值。

python

# 定义一个元组
tp = ('冰淇淋', '大盘鸡', '奶茶', '榴莲')

# 尝试修改元组中的元素
tp[0] = '火锅'

运行代码会报错:

plaintext

TypeError: 'tuple' object does not support item assignment

这就是元组 “不可变” 特性的直接体现,也是它和列表最本质的区别。

2.2 删除元组的正确方式

虽然我们不能修改元组中的单个元素,但可以使用 del 关键字删除整个元组对象

示例代码:

python

# 第1行:创建一个元组并赋值给变量tp
tp = ('冰淇淋', '大盘鸡', '奶茶', '榴莲')
# 第2行:删除元组对象tp
del tp
# 第3行:尝试打印已经被删除的元组
print(tp)

运行结果会抛出错误:

plaintext

Traceback (most recent call last):
  File "E:/书代码/第4章/第6个程序.py", line 3, in <module>
    print(tp)
NameError: name 'tp' is not defined

这个报错提示我们,tp 这个变量名已经没有对应的定义了。这是因为 del 关键字会直接从计算机内存中清除元组对象,以及它和变量名的绑定关系,所以后续再访问 tp 就会报错。


3 元组的创建方式

除了直接用圆括号定义,Python 还提供了 tuple() 函数来创建元组,这种方式尤其适合创建空元组,或者将其他数据类型(比如字符串、列表)转换为元组。

示例代码:

python

# 第1行:创建一个空元组
a = tuple()
# 第2行:将字符串"Python"转换为元组
b = tuple('Python')
# 第3行:打印两个元组
print(a, b)

plaintext

() ('P', 'y', 't', 'h', 'o', 'n')
  • a = tuple() 创建了一个空元组 ()
  • b = tuple('Python') 将字符串 'Python' 按字符拆分,转换为了每个字符为一个元素的元组 ('P', 'y', 't', 'h', 'o', 'n')

4 元组的应用场景

元组的 “不可变” 特性让它在一些场景中非常有用:

  1. 数据安全性高:一旦创建就不能被随意修改,适合存储不希望被意外改动的数据,比如配置信息、常量数据。
  2. 作为字典的键:字典的键必须是不可变类型,元组可以作为字典的键,而列表则不行。
  3. 函数返回多个值:Python 中函数返回多个值时,本质上就是返回一个元组。

存储,查询最快

字典是无序、键值对、可修改类型,用花括号 {} 表示。


Python 字典类型详解:从基础到投票统计实战

1 字典的基本概念

在 Python 中,字典(dict)是一种由 ** 键值对(key-value)** 组成的可变序列数据类型,和列表、元组不同,它不支持索引访问,而是通过唯一的键(key)来访问对应的值(value)。

字典的通用形式如下:

python

{键1: 值1, 键2: 值2, 键3: 值3, ...}
  • 键(key):必须是不可变且唯一的数据类型,如字符串、数字、元组,不能是列表或字典(无法保证唯一性)。
  • 值(value):可以是任意数据类型,如数字、字符串、列表、字典等,且值可以重复。

示例代码:

python

# 创建一个存储学生信息的字典
d = {202101:'张三', 202102:'李四', 202103:'王五'}
# 输出字典内容、长度和类型
print(d, len(d), type(d))

plaintext

{202101: '张三', 202102: '李四', 202103: '王五'} 3 <class 'dict'>

2 字典的创建与基础操作

2.1 创建字典的两种方式

  1. 直接定义:使用花括号 {} 直接创建键值对。

    python

    # 直接创建字典
    student = {"name": "张三", "age": 18, "grade": "高三"}
    
  2. 使用 dict() 函数:创建空字典,或把其他可迭代对象转换为字典。

    python

    # 创建空字典
    a = dict()
    # 给空字典添加键值对
    a[202104] = "赵六"
    print(a)
    
     

    plaintext

    {202104: '赵六'}
    

2.2 向字典中添加 / 修改数据

字典支持直接通过键赋值的方式添加或修改数据:

python

# 空字典
info = {}
# 添加键值对
info["school"] = "清华大学"
info["major"] = "计算机科学"
# 修改已存在的键的值
info["major"] = "人工智能"
print(info)

plaintext

{'school': '清华大学', 'major': '人工智能'}

注意:如果键不存在,赋值操作会添加新的键值对;如果键已存在,会直接覆盖原来的值。


3 获取字典元素

字典不支持索引或切片访问,只能通过来获取对应的值,有两种常用方式:

3.1 直接通过键获取

python

d = {202101:'张三', 202102:'李四', 202103:'王五'}
# 通过键获取值
print(d[202102])

plaintext

李四

⚠️ 注意:如果访问不存在的键,会直接抛出 KeyError 错误,例如 print(d[202104]) 会报错。

3.2 使用 get() 方法安全获取

get(参数1, 参数2) 方法可以安全地获取字典中的值,避免 KeyError

  • 如果键存在,返回对应的值;
  • 如果键不存在,返回 None(默认)或你指定的参数 2。

示例代码:

python

d = {202101:'张三', 202102:'李四', 202103:'王五'}
print(d.get(202102))          # 键存在,返回对应值
print(d.get(202104))          # 键不存在,返回None
print(d.get(202104, '查询不到!'))  # 键不存在,返回指定的默认值

plaintext

李四
None
查询不到!

4 字典的常用方法

Python 为字典提供了多种内置方法,以下是最常用的几种:

表格

方法 功能说明 示例代码
clear() 清空字典中的所有元素,变为空字典 d.clear()
keys() 获取字典中所有的键,返回 dict_keys 类型 print(d.keys())
values() 获取字典中所有的值,返回 dict_values 类型 print(d.values())
items() 获取字典中所有的键值对,返回 dict_items 类型 print(d.items())
pop(键) 删除指定键对应的键值对,并返回被删除的值 a = d.pop(202102)

4.1 keys()values()items() 方法详解

这三个方法返回的都是 Python 内部的特殊数据类型,需要用 list() 函数转换为列表才能直接使用:

python

d = {202101:'张三', 202102:'李四', 202103:'王五'}
# 获取所有键并转为列表
print(list(d.keys()))
# 获取所有值并转为列表
print(list(d.values()))
# 获取所有键值对并转为列表
print(list(d.items()))

运行结果:

plaintext

[202101, 202102, 202103]
['张三', '李四', '王五']
[(202101, '张三'), (202102, '李四'), (202103, '王五')]

4.2 pop() 方法示例

python

d = {202101:'张三', 202102:'李四', 202103:'王五'}
# 删除键为202102的键值对,并将被删除的值赋值给变量a
a = d.pop(202102)
print(d, a)

plaintext

{202101: '张三', 202103: '王五'} 李四

5 字典的遍历

使用 for 循环可以遍历字典,根据需求可以选择不同的遍历方式:

5.1 遍历所有键

python

d = {202101:'张三', 202102:'李四', 202103:'王五'}
for key in d:
    print(key)

plaintext

202101
202102
202103

5.2 同时遍历键和值

python

d = {202101:'张三', 202102:'李四', 202103:'王五'}
for key, value in d.items():
    print(key, value)

plaintext

202101 张三
202102 李四
202103 王五

6 数据的维度:列表与字典的应用场景

在 Python 中,我们可以用列表和字典表示不同维度的数据:

  • 一维数据:一行数据,用列表表示,如 [34, 67, 89]
  • 二维数据:表格形式的数据,用嵌套列表表示,每个子列表对应一行数据。

    python

    # 二维数据示例(类似表格)
    table = [
        ['日期', '芯片', '手机', '智能设备'],
        ['1日', 4556.448898, 1412.691145, 1070.940706],
        ['2日', 5857.880571, 1103.11709, 742.1934921]
    ]
    # 获取表格第2行第3列的数据
    print(table[1][2])  # 输出: 1412.691145
    
  • 高维数据:包含多个二维表格的数据(如多个工作表的 Excel 文件),用字典表示,键对应工作表名称,值对应二维数据列表。

7 实战项目:自动统计班长候选人票数

7.1 固定投票数据统计

实现一个程序,统计班级投票中每位候选人的得票总数。

python

# 1. 创建空字典,用于存储候选人票数
D = dict()
# 2. 模拟所有学生的投票信息
ls = ['王五', '张三', '李四', '李四', '李四', '朱七', '李四', '王五', '张三', '张三']
# 3. 遍历投票列表,统计票数
for vote in ls:
    # 若候选人不在字典中,默认票数为0,再+1;若已存在,直接在原票数+1
    D[vote] = D.get(vote, 0) + 1
# 4. 输出统计结果
print(D)

plaintext

{'王五': 2, '张三': 3, '李四': 4, '朱七': 1}

可以看到,李四的票数最高,当选班长。

7.2 模拟学生实时投票

在上面的基础上,实现一个支持学生输入投票的程序,输入结束停止投票并统计结果:

python

# 1. 创建空列表,存储学生的投票信息
ls = []
# 2. 循环接收投票输入
while True:
    name = input('请输入您要投票的内容: ')
    if name != '结束':
        ls.append(name)
    else:
        break
# 3. 创建空字典统计票数
D = dict()
for vote in ls:
    D[vote] = D.get(vote, 0) + 1
# 4. 输出统计结果
print(D)

plaintext

请输入您要投票的内容: 王五
请输入您要投票的内容: 张三
请输入您要投票的内容: 张三
请输入您要投票的内容: 李四
请输入您要投票的内容: 结束
{'王五': 1, '张三': 2, '李四': 1}

本章总结

表格

类型 符号 是否可修改 有序 适用场景
列表 list [] 可修改 有序 批量数据、增删频繁
元组 tuple () 不可修改 有序 固定配置、安全数据
字典 dict {} 可修改 无序 键值查询、高维数据

本章是 Python 数据处理的基石,务必熟练掌握:索引、切片、遍历、常用方法!

更多推荐