集合与列表有何不同的使用场景,如何选择?

news/2025/10/25 21:28:09/文章来源:https://www.cnblogs.com/nxhujiee/p/19166000

在Python中,集合(set)列表(list)是两种不同的数据结构,各自有独特的使用场景和特性。选择它们的关键在于是否需要唯一性顺序性高效的查找/修改操作。以下是详细对比和选择建议:


1. 核心特性对比

特性 列表(List) 集合(Set)
顺序性 有序(按插入顺序存储) 无序(不保证顺序)
唯一性 允许重复元素 自动去重(所有元素唯一)
可变性 可变(可修改内容) 可变(可修改内容)
元素类型 可包含任何类型(包括可变类型如列表) 元素必须是不可变类型(如数字、字符串、元组)
查找效率 O(n)(线性查找) O(1)(哈希查找,极快)
内存占用 较高(存储索引和元素) 较低(仅存储唯一元素)

2. 使用场景对比

(1)列表(List)的适用场景

  • 需要保留插入顺序:例如日志记录、时间序列数据。
  • 需要重复元素:例如统计词频(["a", "a", "b"])。
  • 需要索引访问:例如通过下标快速访问元素(list[0])。
  • 需要可变长度:例如动态添加/删除元素(append()remove())。
  • 需要切片操作:例如获取子列表(list[1:3])。

示例

# 记录学生成绩(允许重复分数)
grades = [90, 85, 90, 78, 92]
print(grades[0])  # 输出第一个分数:90

(2)集合(Set)的适用场景

  • 需要去重:例如统计唯一用户ID、过滤重复数据。
  • 快速查找/判断存在性:例如检查元素是否在集合中(if x in set)。
  • 集合运算:例如求交集、并集、差集(&|-)。
  • 不需要顺序或索引:例如存储一组不相关的标签。

示例

# 统计唯一访问用户
users = {"Alice", "Bob", "Alice", "Charlie"}
print(users)  # 输出:{'Bob', 'Alice', 'Charlie'}(去重)# 检查用户是否存在
if "Bob" in users:print("Bob is active")# 集合运算:求共同好友
friends_a = {"Alice", "Bob", "David"}
friends_b = {"Bob", "Charlie", "David"}
common_friends = friends_a & friends_b  # 交集
print(common_friends)  # 输出:{'Bob', 'David'}

3. 如何选择?

需求 选择 原因
需要保留顺序或重复元素 列表(List) 列表支持索引和重复,适合有序数据。
需要快速查找或去重 集合(Set) 集合的哈希查找效率高(O(1)),且自动去重。
需要集合运算(交/并/差集) 集合(Set) 集合原生支持数学运算,代码更简洁。
需要可变长度或切片操作 列表(List) 列表支持动态修改和切片,集合不支持。
元素是可变类型(如列表) 列表(List) 集合要求元素不可变,列表无此限制。

4. 性能对比示例

(1)查找效率

import time# 列表查找(O(n))
large_list = list(range(1_000_000))
start = time.time()
999_999 in large_list  # 线性查找
print(f"List lookup time: {time.time() - start:.6f}s")# 集合查找(O(1))
large_set = set(large_list)
start = time.time()
999_999 in large_set  # 哈希查找
print(f"Set lookup time: {time.time() - start:.6f}s")

输出(集合查找快得多):

List lookup time: 0.045678s
Set lookup time: 0.000002s

(2)去重效率

# 列表去重(需额外操作)
data = [1, 2, 2, 3, 3, 3]
unique_list = list(set(data))  # 先转集合去重,再转回列表
print(unique_list)  # 输出:[1, 2, 3]# 集合直接去重
unique_set = set(data)
print(unique_set)  # 输出:{1, 2, 3}

5. 总结

  • 用列表(List):需要顺序、重复元素、索引或切片时。
  • 用集合(Set):需要去重、快速查找或集合运算时。
  • 混合使用:例如先用列表存储数据,再转集合去重或快速查找。

根据具体需求选择合适的数据结构,可以显著提升代码效率和可读性!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

102302147傅乐宜作业1

1.用requests和BeautifulSoup库方法爬取大学排名信息 内容 核心代码:点击查看代码 import urllib.request from bs4 import BeautifulSoupurl = http://www.shanghairanking.cn/rankings/bcur/2020 response = urllib…

完整教程:ros_control 中 hardware_interface 教程

完整教程:ros_control 中 hardware_interface 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

飞牛NAS的SSL证书过期,又开启了强制HTTPS,进不去界面修改SSL怎么办? - 详解

飞牛NAS的SSL证书过期,又开启了强制HTTPS,进不去界面修改SSL怎么办? - 详解2025-10-25 21:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

多表查询-练习

-- 多表查询-练习1 -- 1.查询员工的姓名、年龄、职位、部门信息。(隐式内连接) select e.name,e.age,e.job,d.* from emp e ,dept d where e.dept_id = d.id; -- 2.查询年龄小于30岁的员工姓名、年龄、职位、部门信息。…

多智能体大模型在农业中的应用研究与展望

研究意义 首次系统提出“多智能体 大语言模型”在农业中的完整技术框架,为“耕-种-管-收”全流程智能化、无人化提供理论+落地路线。 技术框架• 多智能体系统(MAS)=“角色分工 + 动态协作 + 分布式决策”。 • 大…

嵌入式基础作业--第七周--IIC协议采集温湿度与OLED显示

任务一. 解释什么是“软件I2C”和“硬件I2C” 根据野火教材第23章"IC--读写EEPROM"的内容,详细解释软件I2C和硬件I2C的概念和区别: I2C总线基础 I2C(Inter-Integrated Circuit)是一种两线式串行总线,包…

Nature子刊 | 基于生物学信息的神经网络

机器学习模型在多组学数据中的应用常常需要在预测准确性与生物学可解释性之间进行权衡。一种新兴的深度学习架构通过结构化地编码生物学知识,以提升预测能力和可解释性。然而,更广泛地采用这种架构仍面临着机遇与挑战…

2025年项目总延期?这30款项目进度管理软件一定有一款适合你!

项目总延期是困扰团队效率的常见难题,但选对工具能让交付率提升至85%以上。本文将为您精选30款高效的项目进度管理软件,覆盖从敏捷开发到传统瀑布模型的不同需求。无论是Codes的全流程管控、Jira的敏捷适配性,还是T…

Educational Codeforces Round 66 (Rated for Div. 2) A~F

A - From Hero to Zero 模拟。 能除 \(k\) 直接除 \(k\),否则减掉余数部分。点击查看代码 #include <bits/stdc++.h>using i64 = long long;void solve() {i64 n, k;std::cin >> n >> k;i64 ans = …

小程序原创--基于微信开发者工具实现的猜谜游戏程序 - 教程

小程序原创--基于微信开发者工具实现的猜谜游戏程序 - 教程2025-10-25 21:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

stm32使用SPI外设读取W25Q32芯片

void SPI_GPIO_Init(void) {//SPI2-NSS PB12:PIN25 --CS//SPI2-SCK PB13:PIN26//SPI2-MISO PB14:PIN27 W25Q32:DO//SPI2-MOSI PB15:PIN28 W25Q32:DIGPIO_InitTypeDef GPIO_InitStruct; SPI_InitTypeDef …

Avjinder Singh Kaler | 数量遗传学基础

研究对象与核心思想• 数量遗传学研究数量性状(如身高、产量等连续变异性状)的遗传规律。 • 特点:受多基因控制,且环境效应显著。单基因模型基础• 单基因模型是数量遗传理论的起点,假设一个基因位点有两个等位基…

鲁东大学提出可解释的自适应集成机器学习全基因组选择算法用于小麦产量性状关键SNPs筛选

研究背景 全基因组选择(genomic selection, GS)是现代分子育种中的一项重要技术,作为一种强大的机器学习GS方法,堆叠集成学习(stacking ensemble learning, SEL)有效地融合了不同模型(基学习器)的优势,以精确…

台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解

台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

数论专题小记

我的数论以前一只因为对数字的恐惧而搁置,准备这几天补回来 /kk。 狄利克雷卷积&莫比乌斯反演我们定义 狄利克雷卷积 这种运算是把两个数轮函数 \(f,g\) 卷成另一个函数 \(t\),其中 \(t\) 满足: \(\ \ \ \ \ \ …

ReactUse 与ahook对比 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机械臂和相机的9点标定原理

9点标定到底怎么工作的? 这个问题困惑了我很久,虽然想海康VisionMaster 和Halcon 这种软件都提供了很好用的工件,但是最好懂原理,这样才不仅能做项目,还能做好项目。 最近好好研究了一下,感觉是搞清楚了,就记录…

遗传改良中的核心技术:交配设计

分享一则报告,系统总结了植物育种中常用的交配设计(Mating Designs)方法。定义与目的定义:交配设计是指为产生后代而在植物群体间有计划的杂交方案。目的:理解性状或行为的遗传控制机制;为作物品种开发提供基础群…

语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来 - 教程

语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

书籍推荐 | 《数量遗传学》(王建康)

数量遗传学是智能育种必学课程,这里推荐一本由中国农科院作物科学研究所王建康老师主编的教材。本书系统介绍群体遗传与数量遗传的基本理论及其在动植物育种中的应用。全书分群体遗传、数量遗传、育种应用和基因定位四…