Python数据结构简介
当涉及到学习编程时,无论你选择的编程语言是什么,你会发现你所接触到的大部分内容都可以归类到几个主要的话题中。一般来说,这些话题按照理解的顺序如下:语法(语言的词汇);命令(将词汇组合成有用的方式);流程控制(我们如何指导命令执行的顺序);算法(解决特定问题的步骤…为什么这个词变得如此令人困惑?);最后,数据结构(在算法执行过程中用于数据操作的虚拟存储仓库(再次强调…一系列的步骤))。
基本上,如果你想通过将一系列命令组合成算法的步骤来实现解决问题的方案,在某个时刻需要处理数据,数据结构将变得至关重要。这些数据结构提供了一种有效组织和存储数据的方式,并且对于创建快速、模块化的能够执行有用功能并且能够良好扩展的代码至关重要。Python作为一种具体的编程语言,拥有一系列内置的数据结构。
本教程将重点介绍以下四种基本的Python数据结构:
- 列表 – 有序、可变、允许重复元素。用于存储数据序列。
- 元组 – 有序、不可变、允许重复元素。将它们视为不可变列表。
- 字典 – 无序、可变、由键值对映射。用于以键值格式存储数据。
- 集合 – 无序、可变、包含唯一元素。用于成员测试和去除重复元素。
除了基本的数据结构之外,Python还提供了更高级的结构,如堆、队列和链表,它们可以进一步增强您的编码能力。这些高级结构建立在基础结构之上,可以处理更复杂的数据,并且经常在特定场景中使用。但是您在这里并不受限制;您也可以将所有现有的结构作为实现自己结构的基础。然而,列表、元组、字典和集合的理解仍然至关重要,因为它们是更高级数据结构的基石。
本指南旨在清晰简明地介绍这些核心结构。当您开始Python之旅时,以下几个部分将引导您了解关键概念和实际应用。从创建和操作列表到利用集合的独特功能,本教程将为您提供在编码中优秀的技能。
第一步:使用Python中的列表
Python中的列表是什么?
Python中的列表是一种有序、可变的数据类型,可以存储各种对象,允许重复元素。列表通过使用方括号[ ]
来定义,元素之间用逗号分隔。
例如:
fibs = [0, 1, 1, 2, 3, 5, 8, 13, 21]
列表非常有用于组织和存储数据序列。
创建列表
列表可以包含不同的数据类型,如字符串、整数、布尔值等。例如:
mixed_list = [42, "Hello World!", False, 3.14159]
操作列表
可以访问、添加、修改和删除列表中的元素。例如:
# 访问第二个元素(索引从'0'开始)
print(mixed_list[1])
# 添加元素
mixed_list.append("This is new")
# 修改元素
mixed_list[0] = 5
# 删除最后一个元素
mixed_list.pop(0)
有用的列表方法
一些方便的内置列表方法包括:
sort()
– 对列表进行原地排序append()
– 在列表末尾添加元素insert()
– 在指定索引处插入元素pop()
– 移除指定索引处的元素remove()
– 移除第一次出现的指定值reverse()
– 原地反转列表
使用列表的实际例子
# 将购物车创建为一个列表
cart = ["苹果", "橙子", "葡萄"]
# 对列表进行排序
cart.sort()
# 添加新的项目
cart.append("蓝莓")
# 移除第一个项目
cart.pop(0)
print(cart)
输出:
['葡萄', '橙子', '蓝莓']
第二步:理解Python中的元组
什么是元组?
元组是Python中的另一种序列数据类型,类似于列表。然而,与列表不同的是,元组是不可变的,意味着一旦创建,其元素就不能被修改。元组通过用括号 ( )
括起来定义。
# 定义一个元组
my_tuple = (1, 2, 3, 4)
何时使用元组
通常情况下,元组用于存储不应被修改的项目集合。元组比列表更快,这使得它们非常适合只读操作。一些常见的用例包括:
- 存储常量或配置数据
- 具有多个组件的函数返回值
- 字典键,因为它们是可哈希的
访问元组元素
访问元组中的元素与访问列表元素的方式类似。索引和切片的工作方式也相同。
# 访问元素
first_element = my_tuple[0]
sliced_tuple = my_tuple[1:3]
元组上的操作
由于元组是不可变的,许多列表操作如append()
或remove()
不适用。然而,您仍然可以执行一些操作:
- 连接:使用
+
运算符将元组组合起来。
concatenated_tuple = my_tuple + (5, 6)
- 重复:使用
*
运算符重复一个元组。
repeated_tuple = my_tuple * 2
- 成员关系:使用
in
关键字检查元素是否存在于元组中。
exists = 1 in my_tuple
元组方法
与列表相比,元组的内置方法较少,这是由于它们的不可变性质。一些有用的方法包括:
count()
:计算特定元素的出现次数。
count_of_ones = my_tuple.count(1)
index()
:找到第一个出现的值的索引。
index_of_first_one = my_tuple.index(1)
元组的打包和解包
元组的打包和解包是Python中的便利特性:
- 打包:将多个值分配给单个元组。
packed_tuple = 1, 2, 3
- 解包:将元组的元素分配给多个变量。
a, b, c = packed_tuple
不可变但不严格
虽然元组本身是不可变的,但它们可以包含像列表这样的可变元素。
# 具有可变列表的元组
complex_tuple = (1, 2, [3, 4])
请注意,虽然您无法更改元组本身,但可以修改其中的可变元素。
第3步:精通Python中的字典
Python中的字典是什么?
Python中的字典是一种无序的可变数据类型,用于存储唯一键与值之间的映射。字典使用大括号{ }
编写,并由逗号分隔的键值对组成。
例如:
student = {"name": "Michael", "age": 22, "city": "Chicago"}
字典用于以结构化的方式存储数据,并通过键访问值。
创建字典
字典的键必须是不可变对象,例如字符串,数字或元组。字典的值可以是任何对象。
student = {"name": "Susan", "age": 23}
prices = {"milk": 4.99, "bread": 2.89}
操作字典
可以通过键访问、添加、更改和删除元素。
# 通过键访问值
print(student["name"])
# 添加新的键值
student["major"] = "计算机科学"
# 更改值
student["age"] = 25
# 删除键值
del student["city"]
有用的字典方法
一些有用的内置方法包括:
keys()
– 返回键的列表values()
– 返回值的列表items()
– 返回(key, value)元组get()
– 返回键的值,避免KeyErrorpop()
– 删除键并返回值update()
– 添加多个键值
使用字典的实际例子
scores = {"Francis": 95, "John": 88, "Daniel": 82}
# 添加新的分数
scores["Zoey"] = 97
# 删除John的分数
scores.pop("John")
# 获取Daniel的分数
print(scores.get("Daniel"))
# 打印所有学生姓名
print(scores.keys())
第4步:探索Python中的集合
Python中的集合是什么?
Python中的集合是一种无序的可变集合,用于存储唯一的不可变对象。集合使用大括号{ }
编写,但与字典不同,集合没有键值对。
例如:
numbers = {1, 2, 3, 4}
集合用于成员测试,消除重复项和数学运算。
创建集合
通过将列表传递给set()
构造函数,可以从列表创建集合:
my_list = [1, 2, 3, 3, 4]
my_set = set(my_list) # {1, 2, 3, 4}
集合可以包含混合的数据类型,如字符串、布尔值等。
操作集合
可以向集合添加和删除元素。
numbers.add(5)
numbers.remove(1)
有用的集合操作
一些有用的集合操作包括:
union()
– 返回两个集合的并集intersection()
– 返回两个集合的交集difference()
– 返回两个集合的差集symmetric_difference()
– 返回两个集合的对称差集
使用集合的实例
A = {1, 2, 3, 4}
B = {2, 3, 5, 6}
# 并集 - 合并集合
print(A | B)
# 交集
print(A & B)
# 差集
print(A - B)
# 对称差集
print(A ^ B)
第5步:比较列表、字典和集合
特性比较
以下是我们在本教程中提到的四种Python数据结构的简明比较。
结构 | 有序 | 可变 | 重复元素 | 用途 |
---|---|---|---|---|
列表 | 是 | 是 | 是 | 存储序列 |
元组 | 是 | 否 | 是 | 存储不可变序列 |
字典 | 否 | 是 | 键:否值:是 | 存储键值对 |
集合 | 否 | 是 | 否 | 消除重复项,成员测试 |
何时使用每种数据结构
将此视为在特定情况下首先转向哪种结构的软指南。
- 使用列表存储有序的基于序列的数据。对于堆栈/队列很有用。
- 使用元组存储有序的不可变序列。当您需要一组固定的不应更改的元素时很有用。
- 使用字典存储键值数据。对于存储相关属性很有用。
- 使用集合存储唯一元素和执行数学运算。
使用所有四种数据结构的实例
让我们来看一个比一行更复杂的例子,看看这些结构如何一起工作。
# 创建一个人名列表
names = ["John", "Mary", "Bob", "Mary", "Sarah"]
# 创建一个元组,用于存储其他信息(例如,电子邮件)
additional_info = ("john@example.com", "mary@example.com", "bob@example.com", "mary@example.com", "sarah@example.com")
# 创建一个集合来去除重复项
unique_names = set(names)
# 创建一个名字-年龄对的字典
persons = {}
for name in unique_names:
persons[name] = random.randint(20,40)
print(persons)
输出:
{'John': 34, 'Bob': 29, 'Sarah': 25, 'Mary': 21}
这个例子利用了列表来存储有序序列,元组来存储额外的不可变信息,集合来去除重复项,以及字典来存储键值对。
继续前进
在这个全面的教程中,我们深入研究了Python中的基本数据结构,包括列表、元组、字典和集合。这些结构是Python编程的基石,为数据存储、处理和操作提供了框架。了解这些结构对于编写高效、可扩展的代码至关重要。从使用列表操作序列,到在字典中使用键值对组织数据,再到使用集合确保唯一性,这些基本工具在数据处理中提供了极大的灵活性。
正如我们通过代码示例所看到的,这些数据结构可以以各种方式组合起来解决复杂的问题。通过利用这些数据结构,您可以在数据分析、机器学习等领域打开更多可能性的大门。不要犹豫,探索官方Python数据结构文档以获取更多见解。
Happy coding!
Matthew Mayo (@mattmayo13) 拥有计算机科学硕士学位和数据挖掘研究生文凭。作为VoAGI的主编,Matthew旨在让复杂的数据科学概念变得易于理解。他的专业兴趣包括自然语言处理、机器学习算法和探索新兴的人工智能。他的使命是在数据科学社区中普及知识。Matthew从6岁开始编程。