【Python基础篇】——第3篇:从入门到精通:掌握Python数据类型与数据结构

第3篇:数据类型与数据结构

目录

  1. Python中的数据类型概述
  2. 列表(List)
    • 创建列表
    • 列表的基本操作
    • 列表方法
    • 列表推导式
  3. 元组(Tuple)
    • 创建元组
    • 元组的基本操作
    • 元组的不可变性
  4. 字典(Dictionary)
    • 创建字典
    • 字典的基本操作
    • 字典方法
  5. 集合(Set)
    • 创建集合
    • 集合的基本操作
    • 集合方法
  6. 数据结构的选择与应用
  7. 示例代码
  8. 常见问题及解决方法
  9. 总结

Python中的数据类型概述

Python是一种动态类型语言,支持多种内置数据类型和复杂的数据结构。理解这些数据类型和数据结构的特性及其应用场景,是编写高效、可维护代码的基础。

常见的数据类型

  1. 数值类型:包括整数(int)、浮点数(float)、复数(complex)。
  2. 字符串类型:用于表示文本数据。
  3. 布尔类型:表示真(True)或假(False)。
  4. 序列类型:如列表(list)、元组(tuple)、字符串(str)。
  5. 映射类型:字典(dict)。
  6. 集合类型:集合(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)在列表末尾添加元素xfruits.append('葡萄')
extend(iterable)使用可迭代对象的元素扩展列表fruits.extend(['樱桃', '梨'])
insert(i, x)在指定位置i插入元素xfruits.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中的四种常用数据类型和数据结构:列表、元组、字典和集合。通过理解它们的特性、基本操作和适用场景,您可以更有效地组织和处理数据,编写高效、可维护的代码。

学习建议

  1. 实践操作:尝试创建并操作不同的数据结构,熟悉它们的使用方法。
  2. 案例分析:分析实际项目中的数据结构选择,理解其背后的原因。
  3. 优化应用:根据数据结构的特性,优化代码的性能和可读性。

接下来的系列文章将继续深入探讨Python的控制流程与函数,帮助您进一步掌握Python编程的核心概念和技巧。保持学习的热情,持续实践,您将逐步成为一名优秀的Python开发者!


如果您有任何问题或需要进一步的帮助,请随时在评论区留言或联系相关技术社区。

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

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

相关文章

3.Qt Quick-QML地图引擎之v4.3版本(新增动态轨迹线/海图/天地图街道/天地图卫星)

在上个版本Qt Quick-QML地图引擎之v4版本(新增多模型切换/3D模型欧拉角模拟)_qt加载3d地图-CSDN博客更新了3D模拟功能,在4.3版本增加动态轨迹线、三个地图(海图/天地图街道/天地图卫星)。 4.3版本已经支持qt6 cmake版本,而4.3版本以下支持qt5版本&#x…

Linux-----线程操作(创建)

目录 创建线程 示例&#xff1a; 创建线程 #include <pthread.h>/*** 创建一个新线程* * pthread_t *thread: 指向线程标识符的指针,线程创建成功时,用于存储新创建线程的线程标识符* const pthread_attr_t *attr: pthead_attr_t结构体,这个参数可以用来设置线程的属性…

我要成为算法高手-DFS篇

目录 题目1&#xff1a;计算布尔二叉树的值题目2&#xff1a;求根节点到叶子结点数字之和题目3&#xff1a;二叉树剪枝题目4&#xff1a;验证二叉搜索树题目4&#xff1a;二叉搜索树中第 K 小的元素题目5&#xff1a;二叉树的所有路径 题目1&#xff1a;计算布尔二叉树的值 23…

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…

Life Long Learning(李宏毅)机器学习 2023 Spring HW14 (Boss Baseline)

1. 终身学习简介 神经网络的典型应用场景是,我们有一个固定的数据集,在其上训练并获得模型参数,然后将模型应用于特定任务而无需进一步更改模型参数。 然而,在许多实际工程应用中,常见的情况是系统可以不断地获取新数据,例如 Web 应用程序中的新用户数据或自动驾驶中的…

Multi-Agent如何设计

文章小结 研究背景和目的 在单一大语言模型长期主导人工智能领域的背景下&#xff0c;多智能体系统在对话任务解决中逐渐崭露头角。 虽然先前的研究已经展示了多智能体系统在推理任务和创造性工作中的潜力&#xff0c;但对于其在对话范式方面的局限性以及单个智能体的影响&am…

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力

文章目录 1、Half Wavelet Attention2、代码实现 paper&#xff1a;HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code&#xff1a;https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…

SpringBoot+Lombok项目实体属性名xXxx格式,前端接收不到

问题解析 今天发现后端传给前端的实体类中&#xff0c;有属性为xXxxx格式的&#xff0c;前端也使用相同名称接收&#xff0c;结果却不显示值&#xff01;研究了一会发现接口请求回来后&#xff0c;原xXxxx的属性名&#xff0c;会被转为全小写。具体原因为&#xff1a;使用Lombo…

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…

网络安全——常用语及linux系统

一、网络安全概念及法规 网络安全&#xff1a;网络空间安全 cyber security 信息系统&#xff1a;由计算机硬件、网络和通信设备、计算机软件、信息资源、信息用户和规章制度组成的已处理信息流为目的的人机一体化系统 信息系统安全三要素&#xff08;CIA&#xff09; 保密…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量&#xff0c;路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了&#xff01;

如何优化Elasticsearch大文档查询?

记录一次业务复杂场景下DSL优化的过程 背景 B端商城业务有一个场景就是客户可见的产品列表是需要N多闸口及各种其它逻辑组合过滤的&#xff0c;各种闸口数据及产品数据都是存储在ES的(有的是独立索引&#xff0c;有的是作为产品属性存储在产品文档上)。 在实际使用的过程中&a…

使用 WPF 和 C# 将纹理应用于三角形

此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …

探索 Transformer²:大语言模型自适应的新突破

目录 一、来源&#xff1a; 论文链接&#xff1a;https://arxiv.org/pdf/2501.06252 代码链接&#xff1a;SakanaAI/self-adaptive-llms 论文发布时间&#xff1a;2025年1月14日 二、论文概述&#xff1a; 图1 Transformer 概述 图2 训练及推理方法概述 图3 基于提示的…

Android Studio历史版本包加载不出来,怎么办?

为什么需要下载历史版本呢&#xff1f; 虽然官网推荐使用最新版本&#xff0c;但是最新版本如果自己碰到问题&#xff0c;根本找不到答案&#xff0c;所以博主这里推荐使用历史版本&#xff01;&#xff01;&#xff01; Android Studio历史版本包加载不出来&#xff1f; 下…

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中&#xff0c;Rewrite Actions 用于对负载均衡响应进行修改&#xff0c;包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成&#xff0c;帮助你根据需求调整请求内容。以下是三种常见的操作&#xff1a; 1. Replace (替换响应头)…

STM32 FreeRTOS移植

目录 FreeRTOS源码结构介绍 获取源码 1、 官网下载 2、 Github下载 源码结构介绍 源码整体结构 FreeRTOS文件夹结构 Source文件夹结构如下 portable文件夹结构 RVDS文件夹 MemMang文件夹 FreeRTOS在基于寄存器项目中移植步骤 目录添加源码文件 工程添加源码文件 …

[Qt]常用控件介绍-按钮类控件-QPushButton、QRedioButton、QCheckBox、QToolButton控件

目录 1.QPushButton按钮 介绍 属性 Demo&#xff1a;键盘方向键控制人物移动 2.Redio Button按钮 属性 clicked、pressed、released、toggled区别 单选按钮的分组 Demo&#xff1a;点餐小程序 3.CheckBox按钮 属性 Demo&#xff1a;获取今天的形成计划 4.ToolBu…

SpringBoot链接Kafka

一、SpringBoot生产者 &#xff08;1&#xff09;修改SpringBoot核心配置文件application.propeties, 添加生产者相关信息 # 连接 Kafka 集群 spring.kafka.bootstrap-servers192.168.134.47:9093# SASL_PLAINTEXT 和 SCRAM-SHA-512 认证配置 spring.kafka.properties.securi…

zerotier搭建虚拟局域网,自建planet

基于该开源项目 自建planet节点&#xff0c;更快速&#xff0c;更安全 本教程依据docker-zerotier-planet 项目文档书写&#xff0c;并以linux(centos 7)和windows作为示例&#xff0c;需要其他系统配置方法&#xff0c;可移步项目文档 一. 前置资源 具有外网ip的服务器 后面…