【Python入门】Python列表和字典:从入门到入土的黑魔法全解,效率直线拉升!

各位小伙伴好,我是唐叔!今天咱们来彻底玩转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万时,推荐使用字典进行操作。

四、实战篇:豆瓣电影数据分析系统

需求分析

  1. 统计电影类型分布
  2. 找出评分TOP3
  3. 查询指定类型电影
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("剧情")])

五、唐叔建议

  1. 可读性 > 炫技
    [x for x in range(10) if x%2==0] 很好,但 list(range(0,10,2)) 更优雅!
  2. 命名要像写小说
    拒绝a = [...],拥抱student_scores = [...]
  3. 注释是你的后悔药
    记住:三个月后的你,看到# 这里处理特殊逻辑会想打人!
  4. 性能意识要刻进DNA
    10条数据随便玩,10万条数据见真章!

最后送大家一句话:代码不仅要跑得动,更要跑得漂亮! 现在就去优化你的列表和字典吧,让同事直呼"这操作太骚了!"

往期文章推荐:

更多内容可以关注 《唐叔学Python》专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值