python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python列表、集合、字典区别

Python列表、集合、字典核心区别举例详解

作者:他们叫我技术总监

在Python中,列表(list)、元组(tuple)、字典(dictionary)和集合(set)是四种常用的数据结构,它们各自有不同的特点和用途,这篇文章主要介绍了Python列表、集合、字典核心区别的相关资料,需要的朋友可以参考下

Python 列表、集合、字典核心区别:从班级分数统计案例彻底讲透

在Python编程学习中,列表(list)、集合(set)、字典(dict)是最常用的三大核心数据结构。很多新手初期极易混淆三者的语法和使用场景——比如同样用大括号包裹的集合和字典、看似都能存数据的列表和集合,到底该在什么场景下用什么结构?

本文将以「班级分数统计」这一贴近实际的案例为核心,从语法特性、使用场景、核心差异三个维度,彻底讲清列表、集合、字典的区别,帮你建立清晰的Python数据结构认知。

一、案例背景:班级分数统计的核心需求

先看一个典型的实际场景:

某班级某次考试的分数列表为 [80,40,60,70,90,90,12,50,80],我们需要完成以下统计需求:

  1. 找出所有不重复的分数(去重);
  2. 统计每个分数对应的出现人数;
  3. 清晰展示分数与人数的对应关系。

这个需求恰好能完美体现列表、集合、字典的分工与差异,我们先看完整实现代码,再拆解分析:

# 1. 原始分数数据:用列表存储(允许重复、有序、可修改)
score = [80,40,60,70,90,90,12,50,80]
print("原始分数列表:", score)

# 2. 分数去重:用集合特性(自动去重、无序、元素唯一)
score_set = set(score)
print("\n去重后的分数集合:", score_set)

# 3. 统计每个分数出现次数:用字典存储(键值对映射关系)
score_count = {}  # 空大括号默认是字典,而非集合
# 遍历去重后的分数集合,统计每个分数在原列表中的出现次数
for s in score_set:
    score_count[s] = score.count(s)

# 4. 输出统计结果
print("\n分数统计结果:")
for score_value, count in score_count.items():
    print(f"成绩为{score_value}分的有{count}人")

# 5. 完整字典展示
print("\n统计结果字典:", score_count)

运行结果:

原始分数列表: [80, 40, 60, 70, 90, 90, 12, 50, 80]

去重后的分数集合: {70, 80, 12, 40, 50, 60, 90}

分数统计结果:
成绩为70分的有1人
成绩为80分的有2人
成绩为12分的有1人
成绩为40分的有1人
成绩为50分的有1人
成绩为60分的有1人
成绩为90分的有2人

统计结果字典: {70: 1, 80: 2, 12: 1, 40: 1, 50: 1, 60: 1, 90: 2}

二、核心拆解:列表、集合、字典在案例中的分工

2.1 列表(list):存储原始数据的“基础容器”

在案例中,score = [80,40,60,70,90,90,12,50,80] 是典型的列表应用,我们先明确列表的核心特性:

(1)语法与定义

(2)在案例中的作用

列表是存储原始分数的最佳选择,原因如下:

(3)列表的常用操作(补充)

# 列表新增元素
score.append(85)  # 末尾添加85
print("添加元素后:", score)  # [80,40,60,70,90,90,12,50,80,85]

# 列表删除元素
score.remove(90)  # 删除第一个90
print("删除元素后:", score)  # [80,40,60,70,90,12,50,80,85]

# 列表索引取值
print("第三个分数:", score[2])  # 60(索引从0开始)

2.2 集合(set):去重的“高效工具”

在案例中,score_set = set(score) 将列表转为集合实现去重,这是集合最核心的应用场景,我们拆解集合的特性:

(1)语法与定义

(2)在案例中的作用

集合的核心价值是“去重”,具体体现在:

(3)集合的其他常用操作(补充)

集合的核心优势除了去重,还有高效的集合运算(交集、并集、差集),比如我们新增一个“及格分数集合”,可以快速筛选出及格/不及格分数:

# 定义及格分数集合(60分及以上)
pass_score = {60,70,80,90}
# 交集:找出既在score_set中又在pass_score中的分数(及格分数)
print("及格分数:", score_set & pass_score)  # {70,80,60,90}
# 差集:找出score_set中有但pass_score中没有的分数(不及格分数)
print("不及格分数:", score_set - pass_score)  # {12,40,50}
# 并集:合并两个集合(无重复)
print("所有分数合并:", score_set | pass_score)  # {70,80,12,40,50,60,90}

2.3 字典(dict):存储映射关系的“通讯录”

在案例中,score_count = {} 定义空字典,最终存储 {分数: 人数} 的映射关系,这是字典的核心应用场景:

(1)语法与定义

(2)在案例中的作用

字典的核心价值是“键值对映射”,具体体现在:

(3)字典的常用操作(补充)

# 新增键值对:添加分数85的统计(假设85出现1次)
score_count[85] = 1
print("新增后字典:", score_count)  # {70:1,80:2,...85:1}

# 修改值:修正80分的统计次数(假设实际是3人)
score_count[80] = 3
print("修改后字典:", score_count)  # {70:1,80:3,...}

# 按键取值
print("80分的人数:", score_count[80])  # 3

# 删除键值对
del score_count[85]
print("删除后字典:", score_count)  # 移除85对应的键值对

三、列表、集合、字典核心对比表

为了让你更直观地记住三者的区别,我们整理了详细的对比表,涵盖语法、特性、使用场景等核心维度:

维度列表(list)集合(set)字典(dict)
语法标识[]非空:{元素},空:set(){key: value},空:{}
核心结构单一元素序列单一元素集合(无映射)键值对(key: value)映射
有序性有序(索引固定)无序(无索引)3.7+有序,3.7以下无序
重复性允许重复元素元素唯一(自动去重)键唯一(重复键覆盖),值可重复
可变性可变(增删改元素)可变(增删元素)可变(增删改键值对)
索引方式数字索引(如 list[0]无索引(无法通过下标取值)键索引(如 dict['key']
核心优势保留顺序、支持重复、通用高效去重、集合运算键值映射、快速查找
典型场景存储原始有序数据(如分数列表)去重、筛选(如及格分数筛选)统计映射(如分数-人数统计)
常用方法append()、remove()、count()add()、update()、&//-

四、避坑指南:新手最易混淆的3个点

4.1 空大括号{}是字典,不是集合

这是最容易踩的坑!Python语法规定:

验证代码:

d = {}
s = set()
print(type(d))  # <class 'dict'>
print(type(s))  # <class 'set'>

4.2 集合不能存储可变元素

集合的元素必须是“不可哈希”的(如数字、字符串、元组),不能存储列表、字典等可变元素,否则会报错:

# 错误:集合中不能放列表
# s = {[1,2], 80}  # TypeError: unhashable type: 'list'

# 正确:集合中放元组(不可变)
s = {(1,2), 80}
print(s)  # {80, (1, 2)}

4.3 字典的键必须是不可变的

字典的键(key)和集合元素要求一致,必须是不可变类型,值(value)可以是任意类型:

# 错误:键不能是列表
# d = {[1,2]: 80}  # TypeError: unhashable type: 'list'

# 正确:键是字符串/数字,值是列表
d = {"score_list": [80,90], 80: [1,2,3]}
print(d)  # {'score_list': [80, 90], 80: [1, 2, 3]}

五、实战总结:如何选择合适的数据结构?

回到班级分数统计的案例,我们可以总结出一套“数据结构选择口诀”,帮你快速决策:

  1. 需要保留顺序、允许重复、频繁修改 → 用列表(如存储原始分数);
  2. 需要去重、集合运算(交集/并集) → 用集合(如分数去重、筛选及格分数);
  3. 需要键值映射、按“关键字”查找 → 用字典(如分数-人数统计、学生姓名-分数映射)。

再举几个实际开发中的例子,帮你巩固:

六、完整案例代码(可直接运行)

为了方便你复制使用,这里给出包含所有功能的完整代码:

# ==================================
# 班级分数统计:列表+集合+字典综合案例
# ==================================

# 1. 定义原始分数列表(有序、可重复、可变)
score = [80,40,60,70,90,90,12,50,80]
print("=== 原始数据 ===")
print("原始分数列表:", score)
print("列表长度(总人数):", len(score))

# 2. 列表转集合实现去重(无序、唯一、可变)
score_set = set(score)
print("\n=== 去重处理 ===")
print("去重后的分数集合:", score_set)
print("去重后分数数量:", len(score_set))

# 3. 集合运算:筛选及格/不及格分数
pass_score = {60,70,80,90}
print("\n=== 集合运算(及格筛选) ===")
print("及格分数(交集):", score_set & pass_score)
print("不及格分数(差集):", score_set - pass_score)

# 4. 字典统计分数出现次数(键值对、键唯一)
score_count = {}
for s in score_set:
    score_count[s] = score.count(s)

# 5. 输出统计结果
print("\n=== 分数统计结果 ===")
# 按分数升序排序输出(字典3.7+有序,排序更直观)
for score_value in sorted(score_count.keys()):
    print(f"成绩为{score_value}分的有{score_count[score_value]}人")

# 6. 字典常用操作演示
print("\n=== 字典操作演示 ===")
# 新增分数85的统计
score_count[85] = 1
print("新增85分后:", score_count)
# 修改80分的统计次数
score_count[80] = 3
print("修改80分次数后:", score_count)
# 删除85分的统计
del score_count[85]
print("删除85分后:", score_count)

七、总结

本文以“班级分数统计”为核心案例,详细拆解了Python中列表、集合、字典的核心区别,核心要点总结如下:

  1. 列表是“有序的容器”,适合存储原始、有序、可重复的数据,核心标识是 []
  2. 集合是“去重的工具”,适合去重和集合运算,核心标识是 set()(空)/{元素}(非空);
  3. 字典是“映射的通讯录”,适合存储键值对关系,核心标识是 {key: value},空字典为 {}
  4. 新手避坑:{} 是空字典,不是空集合;集合元素和字典键必须是不可变类型。

掌握这三大数据结构的区别,是Python入门的关键一步。建议你结合本文的案例代码多动手运行、修改,通过实际操作加深理解——当你能根据需求快速选择合适的数据结构时,就真正掌握了Python数据结构的核心逻辑。

到此这篇关于Python列表、集合、字典核心区别的文章就介绍到这了,更多相关Python列表、集合、字典区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文