各位小伙伴好,我是唐叔!今天咱们来彻底玩转Python中最强大的两个数据结构——列表和字典!有人说它们是基础?NoNoNo!看完这篇,你会知道什么叫"基础操作秒杀同事,高阶技巧震惊老板"!
文章目录
一、基础篇
列表(List)和字典(Dictionary)是Python中最常用的两种数据结构。列表是有序的元素集合,而字典是无序的键值对集合。
不用列表和字典的痛:
# 存储学生姓名
student1 = "张三"
student2 = "李四"
student3 = "王五"
# 存储学生成绩
score1 = 90
score2 = 85
score3 = 95
用列表和字典的爽:
# 使用列表存储学生姓名
students = ["张三", "李四", "王五"]
# 使用字典存储学生成绩
scores = {"张三": 90, "李四": 85, "王五": 95}
1. 列表的"基础操作指南"
常见的列表基础操作包括:创建列表、访问列表、修改列表元素、添加和删除列表元素。
# 1. 创建
fruits = ["苹果", "香蕉", "橘子"] # 空列表:empty_list = []
# 2. 访问
print(fruits[0]) # 苹果(正向索引)
print(fruits[-1]) # 橘子(反向索引)
# 3. 修改
fruits[1] = "芒果" # 列表可变!
# 4. 添加
fruits.append("葡萄") # 末尾追加
fruits.insert(1, "梨") # 指定位置插入
# 5. 删除
del fruits[0] # 按索引删
fruits.remove("梨") # 按值删
除了上述,列表的遍历也是常见操作。针对遍历,列表有正向遍历、反向遍历、索引遍历和条件遍历等多种遍历方式。
# 1. 直接遍历元素
for fruit in fruits:
print(fruit)
# 2. 反向遍历:reversed
for fruit in reversed(fruits):
print(fruit)
# 3. 带索引遍历:enumerate
for index, fruit in enumerate(fruits):
print(f"第{index}个水果是{fruit}")
# 4. 条件遍历:filter
# 只遍历长度大于2的水果
for fruit in filter(lambda x: len(x) > 2, fruits):
print(fruit)
2. 字典的"基础操作要点"
和列表类似,字典基本的操作有创建字典、访问字典、修改字典元素、添加字典元素、删除字典元素和遍历字典。
# 1. 创建
scores = {"张三":90, "李四":85} # 空字典:empty_dict = {}
# 2. 访问
print(scores["张三"]) # 90(Key不存在会报错)
print(scores.get("王五")) # None(安全访问)
# 3. 修改
scores["张三"] = 95 # 直接覆盖
# 4. 添加
scores["王五"] = 88 # 新键自动添加
# 5. 删除
del scores["李四"] # 删除键值对
score = scores.pop("张三") # 删除并返回值
# 6. 遍历
for name, score in scores.items():
print(f"{name}的成绩是{score}")
二、进阶篇
1. 推导式
推导式是Python中一种简洁的语法,用于快速生成列表、字典或集合。它可以用一行代码替代传统的for循环,让你的代码更加优雅。
列表推导式 = 最终值 for 原始值 in 列表
# 传统写法
squares = []
for num in range(10):
squares.append(num**2)
# 推导式写法
squares = [num**2 for num in range(10)]
# 带条件的炫技版
even_squares = [num**2 for num in range(10) if num%2==0]
字典推导式 = 最终字典 for 字典元素变量 in 字典
fruits = ["Apple", "Banana", "Cherry"]
# 传统写法
length_map = {}
for fruit in fruits:
length_map[fruit] = len(fruit)
# 推导式写法
length_map = {fruit: len(fruit) for fruit in fruits}
# 键值反转(小心重复值!)
reverse_map = {v:k for k,v in length_map.items()}
2. 嵌套结构
使用列表 + 字典的嵌套结构,可以实现对复杂数据的高效处理。
列表套字典(电商购物车)
cart = [
{"name": "机械键盘", "price": 299, "quantity": 2},
{"name": "游戏鼠标", "price": 199, "quantity": 3}
]
# 总金额计算(sum+生成器表达式)
total = sum(item["price"] * item["quantity"] for item in cart)
print(f"总价:{total}元") # 输出:总价:1195元
字典套列表(学生管理系统)
students = {
"张三": ["数学", "英语", "物理"],
"李四": ["计算机", "哲学"]
}
# 查找选课最多的学生
max_courses = max(len(courses) for courses in students.values())
print(f"最多选课数:{max_courses}") # 输出:3
三、避坑和性能篇
1. 列表的"死亡陷阱"
一般遍历列表,不建议进行新增或删除操作,否则可能会导致误删或添加位置不正确。
# 错误示范:遍历时删除元素
nums = [1,2,3,4,5]
for num in nums:
if num%2 == 0:
nums.remove(num) # 会导致元素跳过!
# 正确方案:创建新列表
nums = [num for num in nums if num%2 != 0]
2. 字典的"查键奥义"
字典本质上是hash操作,直接使用 get()
可以更高效的查询数据。
# 普通青年
if "张三" in students:
print(students["张三"])
# 内行玩家(避免二次查询)
if (score := students.get("张三")) is not None:
print(score) # 海象运算符Python3.8+
3. 数据结构选择铁律
操作 | 列表时间复杂度 | 字典时间复杂度 |
---|---|---|
查找元素 | O(n) | O(1) |
插入元素 | O(n) | O(1) |
删除元素 | O(n) | O(1) |
唐叔忠告:数据量超1万时,推荐使用字典进行操作。
四、实战篇:豆瓣电影数据分析系统
需求分析
- 统计电影类型分布
- 找出评分TOP3
- 查询指定类型电影
movies = [
{"title": "肖申克的救赎", "type": ["剧情"], "rating": 9.7},
{"title": "霸王别姬", "type": ["剧情", "爱情"], "rating": 9.6},
{"title": "星际穿越", "type": ["科幻", "冒险"], "rating": 9.4}
]
# 1. 类型统计(defaultdict自动初始化)
from collections import defaultdict
type_counts = defaultdict(int)
for movie in movies:
for genre in movie["type"]:
type_counts[genre] += 1
print("类型分布:", dict(type_counts)) # {'剧情':2, '爱情':1, '科幻':1, '冒险':1}
# 2. 评分TOP3(sorted+lambda)
top3 = sorted(movies, key=lambda x: x["rating"], reverse=True)[:3]
print("TOP3:", [m["title"] for m in top3])
# 3. 类型查询(嵌套推导式)
def find_movies(genre):
return [m for m in movies if genre in m["type"]]
print("剧情电影:", [m["title"] for m in find_movies("剧情")])
五、唐叔建议
- 可读性 > 炫技
[x for x in range(10) if x%2==0]
很好,但list(range(0,10,2))
更优雅! - 命名要像写小说
拒绝a = [...]
,拥抱student_scores = [...]
- 注释是你的后悔药
记住:三个月后的你,看到# 这里处理特殊逻辑
会想打人! - 性能意识要刻进DNA
10条数据随便玩,10万条数据见真章!
最后送大家一句话:代码不仅要跑得动,更要跑得漂亮! 现在就去优化你的列表和字典吧,让同事直呼"这操作太骚了!"
往期文章推荐:
更多内容可以关注 《唐叔学Python》专栏。