文章2:深入理解Python的数据结构
目标
掌握Python中常用的数据结构及其操作,包括列表解析式、字典的操作与优化、集合的特性和用途,以及元组的不变性及其应用场景。
一、列表解析式(List Comprehensions)
1. 基本语法
列表解析式通过一行代码生成列表,语法结构为:
csharp
[expression for item in iterable if condition]
- expression:生成列表元素的表达式。
- item:从可迭代对象(如列表、字符串等)中逐个取出的元素。
- iterable:被遍历的可迭代对象。
- condition(可选):过滤条件,只有满足条件的元素会被保留。
2. 示例
- 生成平方数列表:
ini
squares = [x ** 2 for x in range(10)] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
- 过滤偶数:
ini
even_squares = [x ** 2 for x in range(10) if x % 2 == 0] # [0, 16, 36, 64]
- 嵌套循环(生成乘法表):
scss
multiplication_table = [[x * y for y in range(1, 5)] for x in range(1, 5)]
# [[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12], [4, 8, 12, 16]]
- 处理复杂对象(从字典列表中提取符合条件的值):
css
people = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 35}, {"name": "Charlie", "age": 30}, {"name": "David", "age": 40}]
names = [p["name"] for p in people if p["age"] > 30] # ["Bob", "David"]
3. 练习
编写一个列表解析式,生成包含1到5的立方值的列表。
ini
cubes = [x ** 3 for x in range(1, 6)] # [1, 8, 27, 64, 125]
二、字典(Dictionary)的操作和优化
1. 基本操作
- 添加/更新键值对:
ini
my_dict = {"apple": 1, "banana": 2}
my_dict["cherry"] = 3 # 添加新键值对
my_dict["apple"] = 10 # 更新现有键值对
- 删除键值对:
ini
del my_dict["banana"] # 删除指定键
popped_value = my_dict.pop("cherry") # 移除并返回值
- 遍历字典:
python
for key, value in my_dict.items():
print(f"Key: {key}, Value: {value}")
2. 优化技巧
- 安全访问 :使用
get()
方法避免KeyError
:
ini
value = my_dict.get("orange", "Not Found") # 默认返回"Not Found"而非报错
- 字典推导式(快速生成字典):
arduino
# 统计单词出现次数
words = ["apple", "banana", "apple", "cherry"]
word_count = {word: words.count(word) for word in words}
# {"apple": 2, "banana": 1, "cherry": 1}
3. 练习
给定一个单词列表,创建一个字典记录每个单词的出现次数。
ini
words = ["apple", "banana", "apple", "cherry", "banana"]
word_count = {}
for word in words:
word_count[word] = word_count.get(word, 0) + 1
# 或使用推导式:
word_count = {word: words.count(word) for word in set(words)}
三、集合(Set)的特性和用途
1. 核心特性
- 无序:元素不按固定顺序存储。
- 唯一性:集合中的元素不可重复。
- 数学运算:支持交集、并集、差集等操作。
2. 常用操作
- 创建集合:
ini
fruits_set = {"apple", "banana", "cherry"}
- 添加/删除元素:
csharp
fruits_set.add("orange") # 添加元素
fruits_set.remove("banana") # 删除元素
- 集合运算:
ini
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
union = set1 | set2 # 并集:{1, 2, 3, 4, 5, 6}
intersection = set1 & set2 # 交集:{3, 4}
difference = set1 - set2 # 差集:{1, 2}
3. 练习
找出两个列表中共有的元素并以集合形式展示。
ini
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
common_elements = set(list1) & set(list2) # {4, 5}
四、元组(Tuple)的不变性及其应用场景
1. 不变性(Immutable)
- 元组一旦创建,其元素不能被修改、添加或删除。
- 访问速度比列表快,内存占用更少。
2. 应用场景
- 数据安全性:确保数据不被意外修改(如坐标、日期)。
- 字典键:由于元组不可变,可作为字典的键。
- 函数返回多个值:元组天然支持多值返回。
3. 示例
- 定义和访问:
ini
coordinates = (10.0, 20.0)
print(coordinates[0]) # 10.0
- 作为字典键:
ini
location = {(37.7749, -122.4194): "San Francisco"}
- 返回多个值:
ruby
def get_coordinates():
return (34.0522, -118.2437) # 返回洛杉矶坐标
lat, lon = get_coordinates()
4. 练习
创建一个表示一周七天的元组,并访问"星期三"。
ini
days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
print(days[2]) # 输出:"Wednesday"
总结
通过掌握这些数据结构,你可以高效处理各种编程任务:
- 列表解析式:用简洁的代码生成复杂列表。
- 字典:快速查找和映射数据。
- 集合:去重和数学运算的利器。
- 元组:确保数据安全性和高效访问。
继续实践这些数据结构,你将能够编写更简洁、高效的Python代码!