写在前面
回顾一下,在之前的博客中,我们学习了 Python 的基本数据类型(数值、字符串、布尔值)和核心语法(运算符、变量、流程控制、函数、模块)。 现在,我们已经掌握了 Python 编程的基础知识。 接下来,我们将进入数据分析的关键环节: 数据组织。
在数据分析中,数据往往不是孤立存在的,而是以 结构化的方式 组织起来的。 例如,一份销售数据报表,包含多个字段(日期、商品名称、销售额、地区等),这些字段之间相互关联,共同描述了销售情况。 高效地组织和管理这些数据,对于后续的数据分析至关重要。
Excel 表格的局限性:数据组织与处理的瓶颈
对于习惯使用 Excel 的朋友来说,Excel 表格是常用的数据组织方式。 但当数据量增大、数据结构复杂时,Excel 的局限性就显现出来了:
- 数据组织形式单一,难以应对复杂数据结构。 Excel 主要以二维表格形式组织数据,对于更复杂的数据结构(例如树状结构、网络结构等)难以有效表示和处理。
- 数据处理效率低下,操作繁琐。 当数据量较大时,Excel 的筛选、排序、查找等操作会变得缓慢,复杂的公式和函数也难以维护和扩展。
- 代码复用性差,自动化程度低。 Excel 的 VBA 脚本虽然可以实现一定程度的自动化,但学习成本高,代码复用性差,难以构建大型的数据分析流程。
Python 数据结构:数据组织的强大武器
Python 提供了丰富的数据结构,例如 列表 (List)、元组 (Tuple)、字典 (Dictionary) 和 集合 (Set) 等,它们可以灵活、高效地组织和管理各种类型的数据,并为后续的数据分析提供强大的支持。
- 列表 (List): 有序、可变的数据集合,像 Excel 中的一列数据,但功能更强大,可以存储不同类型的数据,并进行灵活的增删改查操作。
- 元组 (Tuple): 与列表类似,但不可变,更轻量级,常用于表示不可修改的数据集合。
- 字典 (Dictionary): 键值对形式的数据集合,像 Excel 中的查找表,但查找效率更高,可以快速根据键找到对应的值,非常适合存储结构化数据。
- 集合 (Set): 无序、唯一元素的数据集合,用于去重、集合运算等,在数据清洗和特征工程中非常有用。
掌握这些 Python 数据结构,你将能够:
- 更灵活地组织和管理各种类型的数据,应对更复杂的数据分析场景。
- 更高效地处理和操作数据,提升数据分析效率。
- 为后续学习 Pandas 等数据分析库打下坚实的基础。
本篇博客将深入讲解这四种常用的 Python 数据结构,让你掌握数据组织的强大武器,为高效数据分析做好充分准备。
📊 一、列表 (List):有序可变的数据容器
列表 (List) 是 Python 中最常用的数据结构之一,它是一个 有序、可变 的数据集合,可以存储多个元素,元素可以是不同的数据类型,并且允许重复元素。 列表非常类似于 Excel 中的一列数据,但功能更加强大和灵活。
1. 列表的创建
列表使用 方括号 [ ]
包裹,元素之间用 逗号 ,
分隔。
# 创建列表的几种方式
numbers = [1, 2, 3, 4, 5] # 数字列表
names = ['Alice', 'Bob', 'Charlie'] # 字符串列表
mixed_list = [1, 'hello', 3.14, True] # 混合类型列表
empty_list = [] # 空列表
list_from_tuple = list((1, 2, 3)) # 从元组创建列表
list_from_range = list(range(5)) # 从 range 对象创建列表
2. 列表的特性
-
有序性 (Ordered): 列表中的元素按照 插入顺序 排列,可以通过 索引 (index) 访问元素,索引从
0
开始。my_list = ['a', 'b', 'c', 'd'] print(my_list[0]) # 输出:a (第一个元素,索引为 0) print(my_list[2]) # 输出:c (第三个元素,索引为 2) print(my_list[-1]) # 输出:d (最后一个元素,索引为 -1)
-
可变性 (Mutable): 列表创建后,可以 修改 列表中的元素,例如添加、删除、修改元素。
my_list = [1, 2, 3] my_list[0] = 10 # 修改第一个元素 print(my_list) # 输出:[10, 2, 3] my_list.append(4) # 在列表末尾添加元素 print(my_list) # 输出:[10, 2, 3, 4] del my_list[1] # 删除索引为 1 的元素 print(my_list) # 输出:[10, 3, 4]
-
允许重复元素 (Duplicates Allowed): 列表中可以包含 相同的元素。
my_list = [1, 2, 2, 3, 3, 3] print(my_list) # 输出:[1, 2, 2, 3, 3, 3] (包含重复元素 2 和 3)
3. 列表的常用操作
-
索引和切片 (Indexing and Slicing):
- 索引访问:
list[index]
访问指定索引位置的元素。 - 切片:
list[start:stop:step]
获取列表的子列表 (切片)。start
为起始索引 (包含),stop
为结束索引 (不包含),step
为步长 (默认为 1)。
numbers = [10, 20, 30, 40, 50, 60] print(numbers[1]) # 索引访问,输出:20 (索引为 1 的元素) print(numbers[2:5]) # 切片,输出:[30, 40, 50] (索引 2, 3, 4 的元素) print(numbers[:3]) # 切片,输出:[10, 20, 30] (从开始到索引 3 之前的元素) print(numbers[4:]) # 切片,输出:[50, 60] (从索引 4 到末尾的元素) print(numbers[::2]) # 切片,输出:[10, 30, 50] (步长为 2) print(numbers[::-1]) # 切片,输出:[60, 50, 40, 30, 20, 10] (倒序列表)
- 索引访问:
-
添加元素:
append(element)
: 在列表 末尾 添加一个元素。insert(index, element)
: 在列表的 指定索引位置 插入一个元素。extend(iterable)
: 将 另一个可迭代对象 (例如列表、元组) 的所有元素 追加到列表末尾。
fruits = ['apple', 'banana'] fruits.append('orange') # 末尾添加 'orange' print(fruits) # 输出:['apple', 'banana', 'orange'] fruits.insert(1, 'grape') # 在索引 1 处插入 'grape' print(fruits) # 输出:['apple', 'grape', 'banana', 'orange'] more_fruits = ['mango', 'kiwi'] fruits.extend(more_fruits) # 追加另一个列表的元素 print(fruits) # 输出:['apple', 'grape', 'banana', 'orange', 'mango', 'kiwi']
-
删除元素:
remove(element)
: 删除列表中 第一个匹配 的指定元素的值。 如果元素不存在,会报错。pop(index=-1)
: 删除列表中 指定索引位置 的元素,并 返回被删除的元素。 默认删除最后一个元素。del list[index]
或del list[start:stop]
: 使用del
语句删除指定索引或切片范围内的元素。
colors = ['red', 'green', 'blue', 'yellow', 'green'] colors.remove('green') # 删除第一个 'green' print(colors) # 输出:['red', 'blue', 'yellow', 'green'] removed_color = colors.pop(2) # 删除索引 2 的元素 ('yellow'),并返回被删除的元素 print(colors) # 输出:['red', 'blue', 'green'] print("Removed color:", removed_color) # 输出:Removed color: yellow del colors[0] # 删除索引 0 的元素 ('red') print(colors) # 输出:['blue', 'green'] del colors[0:2]