【Python基础篇】——第3篇:从入门到精通:掌握Python数据类型与数据结构
第3篇:数据类型与数据结构
目录
- Python中的数据类型概述
- 列表(List)
- 创建列表
- 列表的基本操作
- 列表方法
- 列表推导式
- 元组(Tuple)
- 创建元组
- 元组的基本操作
- 元组的不可变性
- 字典(Dictionary)
- 创建字典
- 字典的基本操作
- 字典方法
- 集合(Set)
- 创建集合
- 集合的基本操作
- 集合方法
- 数据结构的选择与应用
- 示例代码
- 常见问题及解决方法
- 总结
Python中的数据类型概述
Python是一种动态类型语言,支持多种内置数据类型和复杂的数据结构。理解这些数据类型和数据结构的特性及其应用场景,是编写高效、可维护代码的基础。
常见的数据类型
- 数值类型:包括整数(
int
)、浮点数(float
)、复数(complex
)。 - 字符串类型:用于表示文本数据。
- 布尔类型:表示真(
True
)或假(False
)。 - 序列类型:如列表(
list
)、元组(tuple
)、字符串(str
)。 - 映射类型:字典(
dict
)。 - 集合类型:集合(
set
)和冻结集合(frozenset
)。
本文重点介绍列表、元组、字典和集合这四种常用的数据结构。
列表(List)
列表是Python中最常用的数据结构之一,具有可变性和有序性,允许存储不同类型的元素。
创建列表
# 创建空列表
empty_list = []# 创建包含元素的列表
fruits = ['苹果', '香蕉', '橙子']
numbers = [1, 2, 3, 4, 5]
mixed = [1, '苹果', 3.14, True]
列表的基本操作
-
访问元素:使用索引访问,索引从0开始,可以使用负数索引从末尾访问。
fruits = ['苹果', '香蕉', '橙子'] print(fruits[0]) # 输出: 苹果 print(fruits[-1]) # 输出: 橙子
-
切片:获取列表的子集。
numbers = [1, 2, 3, 4, 5] print(numbers[1:3]) # 输出: [2, 3] print(numbers[:2]) # 输出: [1, 2] print(numbers[3:]) # 输出: [4, 5]
-
修改元素:
fruits = ['苹果', '香蕉', '橙子'] fruits[1] = '草莓' print(fruits) # 输出: ['苹果', '草莓', '橙子']
-
添加元素:
fruits.append('葡萄') print(fruits) # 输出: ['苹果', '草莓', '橙子', '葡萄']
-
删除元素:
fruits.remove('草莓') print(fruits) # 输出: ['苹果', '橙子', '葡萄']last_fruit = fruits.pop() print(last_fruit) # 输出: 葡萄 print(fruits) # 输出: ['苹果', '橙子']
列表方法
方法 | 描述 | 示例 |
---|---|---|
append(x) | 在列表末尾添加元素x | fruits.append('葡萄') |
extend(iterable) | 使用可迭代对象的元素扩展列表 | fruits.extend(['樱桃', '梨']) |
insert(i, x) | 在指定位置i插入元素x | fruits.insert(1, '蓝莓') |
remove(x) | 删除列表中第一个值为x的元素 | fruits.remove('香蕉') |
pop([i]) | 移除并返回指定位置i的元素,默认为最后一个元素 | last = fruits.pop() |
clear() | 移除列表中的所有元素 | fruits.clear() |
index(x) | 返回列表中第一个值为x的元素的索引 | fruits.index('苹果') |
count(x) | 返回x在列表中出现的次数 | fruits.count('苹果') |
sort() | 对列表进行就地排序 | numbers.sort() |
reverse() | 将列表中的元素反转 | fruits.reverse() |
copy() | 返回列表的浅拷贝 | new_fruits = fruits.copy() |
列表推导式
列表推导式是一种简洁的创建列表的方式,通常用于对现有列表进行操作或过滤。
# 创建一个包含1到10的平方的列表
squares = [x**2 for x in range(1, 11)]
print(squares) # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 过滤出列表中的偶数
numbers = [1, 2, 3, 4, 5, 6]
evens = [x for x in numbers if x % 2 == 0]
print(evens) # 输出: [2, 4, 6]
元组(Tuple)
元组与列表类似,但具有不可变性。一旦创建,元组的元素不能被修改、添加或删除。
创建元组
# 创建空元组
empty_tuple = ()# 创建包含元素的元组
fruits = ('苹果', '香蕉', '橙子')
numbers = (1, 2, 3, 4, 5)
mixed = (1, '苹果', 3.14, True)
元组的基本操作
-
访问元素:与列表类似,使用索引访问。
fruits = ('苹果', '香蕉', '橙子') print(fruits[0]) # 输出: 苹果 print(fruits[-1]) # 输出: 橙子
-
切片:
numbers = (1, 2, 3, 4, 5) print(numbers[1:3]) # 输出: (2, 3)
-
不可变性:
fruits = ('苹果', '香蕉', '橙子') fruits[1] = '草莓' # 会引发TypeError
元组的不可变性
元组的不可变性使其在需要保证数据不被修改的场景下非常有用。例如,用作字典的键或存储固定的配置信息。
# 使用元组作为字典的键
locations = {(40.7128, -74.0060): "纽约",(34.0522, -118.2437): "洛杉矶",
}
print(locations[(40.7128, -74.0060)]) # 输出: 纽约
字典(Dictionary)
字典是Python中用于存储键值对(key-value)的数据结构,具有高效的查找性能。
创建字典
# 创建空字典
empty_dict = {}# 创建包含元素的字典
person = {'name': 'Alice','age': 25,'city': '北京'
}# 使用dict构造函数
car = dict(make='Toyota', model='Camry', year=2020)
字典的基本操作
-
访问值:通过键访问对应的值。
print(person['name']) # 输出: Alice print(person.get('age')) # 输出: 25
-
修改值:
person['age'] = 26 print(person['age']) # 输出: 26
-
添加键值对:
person['email'] = 'alice@example.com' print(person) # 输出: {'name': 'Alice', 'age': 26, 'city': '北京', 'email': 'alice@example.com'}
-
删除键值对:
del person['city'] print(person) # 输出: {'name': 'Alice', 'age': 26, 'email': 'alice@example.com'}removed_value = person.pop('email') print(removed_value) # 输出: alice@example.com print(person) # 输出: {'name': 'Alice', 'age': 26}
字典方法
方法 | 描述 | 示例 |
---|---|---|
dict.keys() | 返回字典中所有的键 | person.keys() |
dict.values() | 返回字典中所有的值 | person.values() |
dict.items() | 返回字典中所有的键值对 | person.items() |
dict.get(key, default) | 返回指定键的值,如果键不存在则返回默认值 | person.get('name', '未知') |
dict.update(other_dict) | 使用另一个字典更新当前字典 | person.update({'age': 27, 'gender': '女'}) |
dict.pop(key, default) | 移除指定键并返回其值,如果键不存在则返回默认值 | age = person.pop('age', None) |
dict.clear() | 移除字典中的所有元素 | person.clear() |
dict.copy() | 返回字典的浅拷贝 | new_person = person.copy() |
集合(Set)
集合是Python中用于存储唯一元素的无序数据结构,适用于去重和集合运算(如并集、交集等)。
创建集合
# 创建空集合
empty_set = set()# 创建包含元素的集合
fruits = {'苹果', '香蕉', '橙子'}
numbers = {1, 2, 3, 4, 5}
mixed = {1, '苹果', 3.14, True}
注意:创建空集合必须使用set()
,而不是{}
,因为后者表示空字典。
集合的基本操作
-
添加元素:
fruits.add('葡萄') print(fruits) # 输出: {'苹果', '香蕉', '橙子', '葡萄'}
-
删除元素:
fruits.remove('香蕉') # 如果元素不存在,会引发KeyError fruits.discard('草莓') # 如果元素不存在,不会引发错误 print(fruits) # 输出: {'苹果', '橙子', '葡萄'}
-
清空集合:
fruits.clear() print(fruits) # 输出: set()
集合方法
方法 | 描述 | 示例 |
---|---|---|
set.add(elem) | 向集合添加元素 | fruits.add('樱桃') |
set.remove(elem) | 移除集合中的指定元素,如果元素不存在则引发错误 | fruits.remove('苹果') |
set.discard(elem) | 移除集合中的指定元素,如果元素不存在则不操作 | fruits.discard('香蕉') |
set.pop() | 随机移除并返回一个元素 | item = fruits.pop() |
set.clear() | 移除集合中的所有元素 | fruits.clear() |
set.union(other_set) | 返回两个集合的并集 | all_fruits = fruits.union(tropical_fruits) |
set.intersection(other_set) | 返回两个集合的交集 | common_fruits = fruits.intersection(tropical_fruits) |
set.difference(other_set) | 返回集合的差集 | unique_fruits = fruits.difference(tropical_fruits) |
set.symmetric_difference(other_set) | 返回集合的对称差集 | symmetric_fruits = fruits.symmetric_difference(tropical_fruits) |
set.issubset(other_set) | 判断当前集合是否是另一个集合的子集 | fruits.issubset(all_fruits) |
set.issuperset(other_set) | 判断当前集合是否是另一个集合的超集 | all_fruits.issuperset(fruits) |
数据结构的选择与应用
不同的数据结构适用于不同的应用场景。选择合适的数据结构可以提高代码的效率和可维护性。
数据结构 | 特性 | 适用场景 |
---|---|---|
列表 | 有序、可变、允许重复元素 | 需要动态添加、删除元素,或者需要保持元素的顺序时 |
元组 | 有序、不可变、允许重复元素 | 需要保证数据不被修改,或作为字典的键时 |
字典 | 无序、键唯一、可变 | 需要快速查找、关联键值对的数据时 |
集合 | 无序、不重复、可变 | 需要去重、进行集合运算(并集、交集等)时 |
示例应用:
- 列表:存储用户输入的数据,处理动态数据。
- 元组:存储固定的配置信息,如数据库连接参数。
- 字典:存储用户信息,快速通过用户名查找对应的详细信息。
- 集合:统计文章中的独特单词,进行标签的去重。
示例代码
以下示例代码展示了如何使用列表、元组、字典和集合进行基本操作。
# 列表示例
fruits = ['苹果', '香蕉', '橙子']
fruits.append('葡萄')
print(fruits) # 输出: ['苹果', '香蕉', '橙子', '葡萄']# 元组示例
coordinates = (40.7128, -74.0060)
print(coordinates) # 输出: (40.7128, -74.0060)# 字典示例
person = {'name': 'Alice','age': 25,'city': '北京'
}
print(person['name']) # 输出: Alice# 集合示例
unique_numbers = {1, 2, 3, 2, 1}
print(unique_numbers) # 输出: {1, 2, 3}
常见问题及解决方法
问题1:列表和元组的区别是什么?
原因:列表是可变的,而元组是不可变的。
解决方法:根据需求选择使用列表还是元组。如果需要修改数据,使用列表;如果数据不需要改变,使用元组以提高代码的安全性和性能。
问题2:如何在字典中查找键是否存在?
解决方法:使用in
关键字或字典的get()
方法。
person = {'name': 'Alice', 'age': 25}# 使用in关键字
if 'age' in person:print("年龄存在")# 使用get方法
age = person.get('age')
if age is not None:print(f"年龄是 {age}")
问题3:集合中如何进行并集和交集操作?
解决方法:使用union()
和intersection()
方法,或者使用|
和&
运算符。
set1 = {'苹果', '香蕉', '橙子'}
set2 = {'香蕉', '葡萄', '草莓'}# 并集
union_set = set1.union(set2)
print(union_set) # 输出: {'苹果', '香蕉', '橙子', '葡萄', '草莓'}# 交集
intersection_set = set1.intersection(set2)
print(intersection_set) # 输出: {'香蕉'}# 使用运算符
union_set = set1 | set2
intersection_set = set1 & set2
问题4:如何对字典进行遍历?
解决方法:可以遍历字典的键、值或键值对。
person = {'name': 'Alice', 'age': 25, 'city': '北京'}# 遍历键
for key in person:print(key)# 遍历值
for value in person.values():print(value)# 遍历键值对
for key, value in person.items():print(f"{key}: {value}")
总结
在本篇文章中,我们深入探讨了Python中的四种常用数据类型和数据结构:列表、元组、字典和集合。通过理解它们的特性、基本操作和适用场景,您可以更有效地组织和处理数据,编写高效、可维护的代码。
学习建议:
- 实践操作:尝试创建并操作不同的数据结构,熟悉它们的使用方法。
- 案例分析:分析实际项目中的数据结构选择,理解其背后的原因。
- 优化应用:根据数据结构的特性,优化代码的性能和可读性。
接下来的系列文章将继续深入探讨Python的控制流程与函数,帮助您进一步掌握Python编程的核心概念和技巧。保持学习的热情,持续实践,您将逐步成为一名优秀的Python开发者!
如果您有任何问题或需要进一步的帮助,请随时在评论区留言或联系相关技术社区。
相关文章:

【Python基础篇】——第3篇:从入门到精通:掌握Python数据类型与数据结构
第3篇:数据类型与数据结构 目录 Python中的数据类型概述列表(List) 创建列表列表的基本操作列表方法列表推导式 元组(Tuple) 创建元组元组的基本操作元组的不可变性 字典(Dictionary) 创建字典…...

算法3(力扣83)-删除链表中的重复元素
1、题目:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 2、实现( 因为已排序,所以元素若重复,必然在其下一位)(这里为在vscod…...

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载,Scroll滚动到顶部
HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载 效果展示 使用方法 import LoadingText from "../components/LoadingText" import PageToRefresh from "../components/PageToRefresh" import FooterBar from "../components/…...

.NET8.0多线程编码结合异步编码示例
1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序,可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时,它们的具体执行顺序是不确定的,除非我们使用同步机制(如 lock、信号量等&am…...

SpringBoot项目中解决CORS跨域资源共享问题
在Spring Boot项目中解决CORS(跨域资源共享)问题,可以通过以下几种方法: 1. 使用CrossOrigin注解 这是最简单的方法,适用于单个控制器或控制器方法级别的跨域配置。你可以在控制器类或具体的方法上使用CrossOrigin注…...

Android string.xml中特殊字符转义
项目中要在string.xml 中显示特殊符号 空格: (普通的英文半角空格但不换行) 窄空格: (中文全角空格 (一个中文宽度)) (半个中文宽度,但两个空格比一个中文…...

解析传统Workflow、AI Workflow与AI Agent概念,并通过Coze案例探讨利用AI工作流构建应用的实践流程
传统工作流 工作流入门这篇就够了 BPMN.JS中文教程 BPMN 工作流引擎解析 定义:工作流是在计算机支持下业务流程的自动或半自动化,其通过对流程进行描述以及按一定规则执行以完成相应工作。 应用:随着计算机技术的发展以及工业生产、办公自动…...

光谱相机的光谱分辨率可以达到多少?
多光谱相机 多光谱相机的光谱分辨率相对较低,波段数一般在 10 到 20 个左右,光谱分辨率通常在几十纳米到几百纳米之间,如常见的多光谱相机光谱分辨率为 100nm 左右。 高光谱相机 一般的高光谱相机光谱分辨率可达 2.5nm 到 10nm 左右&#x…...

android Recyclerview viewholder统一封装
Recyclerview holder 统一封装 ViewHolder类 import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.CountDownTimer import…...

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)
本文介绍在Windows电脑中,下载、部署NVM(node.js version management)环境,并基于其安装不同版本的Node.js的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法(https://blog.csdn.net/zhebushibiaoshi…...

51单片机入门基础
目录 一、基础知识储备 (一)了解51单片机的基本概念 (二)掌握数字电路基础 (三)学习C语言编程基础 二、开发环境搭建 (一)硬件准备 (二)软件准备 三、…...

老centos7 升级docker.io为docker-ce 脚本
旧的centos7 之前安装的是docker.io 由于一些原因,像docker compose 等版本变化,以及docker.io源受限等,我们要更新到docker-ce 并使用国内阿里云的源怎么处理?下面直接上脚本,upgrade-docker.sh #!/bin/bashset -e# 创建临时目录 TEMP_DIR"./tmp" mkdir -p "…...

数仓建模(三)建模三步走:需求分析、模型设计与数据加载
本文包含: 数据仓库的背景与重要性数据仓库建模的核心目标本文结构概览:需求分析、模型设计与数据加载 目录 第一部分:需求分析 1.1 需求分析的定义与目标 1.2 需求分析的步骤 1.2.1 业务需求收集 1.2.2 技术需求分析 1.2.3 成果输出…...

PHP xml 常用函数整理
————————-DOM 函数————————————– 1、DOMDocument->load() 作用:加载xml文件 用法:DOMDocument->load( string filename ) 参数:filename,xml文件; 返回:如果成功则返回 TRUE&a…...

数据结构(Java版)第八期:LinkedList与链表(三)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、链表中的经典面试题 1.1. 链表分割 1.2. 链表的回文结构 1.3. 相交链表 1.4. 环形链表 一、链表中的经典面试题 1.1. 链表分割 题目中要求不能改变原来的数据顺序,也就是如上图所示。…...

数据结构学习记录-数据结构概念
1 数据结构: 数据结构是计算机存储,管理数据的方式。 数据必须依据某种逻辑联系组织在一起存储在计算机内 数据结构研究的就是这种数据的存储结构和数据的逻辑结构。 1.1 数据的逻辑结构: 逻辑结构指的是数据本身之间的关系 集合&#x…...

【Linux】11.Linux基础开发工具使用(4)
文章目录 3. Linux调试器-gdb使用3.1 背景3.2 下载安装3.3 使用gdb查询3.4 开始使用 3. Linux调试器-gdb使用 3.1 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须…...

数据结构与算法之栈: LeetCode 1047. 删除字符串中的所有相邻重复项 (Ts版)
删除字符串中的所有相邻重复项 https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/ 描述 给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们在 s 上反复执行重复项删除操作,直到无…...

C++ 在线编译软件介绍、杭电OJ、北大OJ、力扣OJ
在线编译软件的话,可见下: https://www.jyshare.com/compile/12/ 杭州电子科技大学开发的一个免费的写代码地址 ,杭电OJ https://bestcoder.hdu.edu.cn/ 北大OJ http://poj.org/ 力扣OJ 力扣 (LeetCode) 全球极客挚爱的技术成长平台...

Java学习笔记(二十三)
1 CacheEvict CacheEvict是Spring框架中用于清空缓存的注解。以下是对CacheEvict注解的详细介绍: 1.1 作用 CacheEvict注解的主要作用是删除缓存中的数据。在方法执行后或执行前(根据配置),它可以清空指定的缓存项或整个缓存区…...

《AI赋能鸿蒙Next,开启智能关卡设计新时代》
在游戏开发领域,关卡设计是至关重要的一环,它直接影响着玩家的游戏体验和沉浸感。而随着人工智能技术的飞速发展,结合鸿蒙Next系统的强大功能,为游戏的智能关卡设计带来了全新的思路和方法。 利用AI学习玩家行为模式 在鸿蒙Next…...

js:正则表达式
目录 正则表达式的语法 定义 检测 检索 元字符 边界符 量词 字符类 表单判断案例 修饰符 过滤敏感词 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本字符组合模式 正则表达式是一…...

linux环境使用docker部署多个war项目
如果你的需求是在一个服务器上部署多个Tomcat项目,并且每个项目需要独立运行,可以通过以下方式实现: 1. 使用不同的端口 每个Tomcat项目可以使用不同的端口号(如9090、9091、9092等),并通过Docker容器分别…...

【react】使用antd Table渲染数据遇到的报错问题
记录自己在开发过程中遇到的报错问题: 目录 原本写法:错误分析:解决方案: 原本写法: render: (text) > {console.log(text, "111111text");console.log(typeof text, "111111text");return t…...

JVM之垃圾回收器G1概述的详细解析
G1(并发) G1 特点 G1(Garbage-First)是一款面向服务端应用的垃圾收集器,应用于新生代和老年代、采用标记-整理算法、软实时、低延迟、可设定目标(最大 STW 停顿时间)的垃圾回收器,用于代替 CMS࿰…...

1.15寒假作业
web:nss靶场ez_ez_php 打开环境,理解代码 使用个体传参的方法,首先代码会检查file参数的前三个字符是不是php,如果是就输出nice,然后用include函数包含file,绕过不是则输出hacker,如果没有file…...

RK356x bsp 5 - 海华AW-CM358SM Wi-Fi/Bt模组调试记录
文章目录 1、环境介绍2、目标3、海华AW-CM358SM3.1、基本信息3.2、支持SDIO3.03.3、电气特性 4、适配流程步骤5、SDIO控制器适配5.1、sdio dts配置5.2、验证 6、Wi-Fi 适配6.1、wifi dts配置6.2、驱动移植6.2.1、kernel menuconfig6.2.2、传统驱动移植6.2.3、RK SDK WIFI/BT驱动…...

支持Google Analytics快捷添加的CMS:费用与部署形式详解
CMS 的费用和部署形式是选择平台的重要参考因素,不同的业务需求需要不同的解决方案。本文将从费用和部署形式两个角度,详细分析支持 Google Analytics 快捷集成的 CMS 和工具,帮助您更好地了解这些平台的特点。 1. BigCommerce 费用ÿ…...

CSS | 实现三列布局(两边边定宽 中间自适应,自适应成比)
目录 示例1 (中间自适应 示例2(中间自适应 示例3(中间自适应 示例4 (自适应成比 示例5(左中定宽,右边自适应 示例6(中间自适应 示例7(中间自适应 示例8(中间定宽…...

fpga系列 HDL:跨时钟域同步 双触发器同步器
目录 **双触发器同步器(Two-Flip-Flop Synchronizer)示例代码**:双触发器同步器的优缺点优点:缺点:适用场景: 应用实例:同步来自spi_slave的单个使能信号 跨时钟域的设计需要特别小心࿰…...