列表推导式
14.10 列表推导式
列表推导式一行快速生成新列表,替代多行for+append,代码简洁运行更快。
本节覆盖基础生成、条件筛选、三元分支、字符串处理、双层循环、字典搭配实战,每段代码附带输出注释,注释通俗详细。
建议:先读懂注释,拆分每段单独运行,修改数字、条件观察输出变化。
💡 基础语法:[表达式 for 变量 in 可迭代对象 if 筛选条件];复杂逻辑不建议多层嵌套推导式,可读性会变差。
列表推导式全套示例
代码每一行都添加详细通俗注释,区分每一部分作用,打印语句末尾附带运行结果注释,可直接复制到py文件运行。
# ======================================== # 示例:列表推导式全场景教学案例 # 说明:建议复制到 .py 文件运行,或粘贴到 Python 交互模式 # 四种基础语法拆解(从上到下难度递增) # 1. 基础无筛选:[运算表达式 for 循环变量 in 循环范围]
# 作用:遍历所有元素,全部做统一处理生成新列表 # 2. 单条件筛选:[运算表达式 for 循环变量 in 循环范围 if 判断条件] # 作用:只保留满足if条件的元素,不满足直接丢弃 # 3. 双分支处理:[表达式1 if 条件 else 表达式2 for 变量 in 范围] # 作用:所有元素都保留,满足条件走第一种处理,不满足走第二种 # 4. 双层循环嵌套:[(变量1,变量2) for 变量1 in 序列1 for 变量2 in 序列2] # 作用:两个循环组合,生成两两配对的数据 # ======================================== # ====================== # 第一部分:基础推导式 统一处理所有数字,无筛选 # ====================== # 需求:生成1~9每个数字的平方 # x**2:对每个数字做平方运算
# for x in range(1,10):x依次取1、2、3...9
square_list = [x ** 2 for x in range(1, 10)] # 输出:1到9每个数字平方组成的列表 print("1-9数字平方:", square_list)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
需求:1~10 所有数字统一加 5 add5_list = [x + 5 for x in range (1, 11)] print ("1-10 各加 5:", add5_list) # [6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
====================== 带 if 条件筛选 只保留符合要求的数据 ======================
需求:取出 0~9 里面所有偶数 if x % 2 == 0:判断数字除以 2 余数等于 0,就是偶数,满足才保留 even_list = [x for x in range (10) if x % 2 == 0] print ("0-9 偶数:", even_list)
# [0, 2, 4, 6, 8]
需求:只计算 1~10 奇数的平方,偶数直接扔掉不处理 先判断是否奇数,是奇数才执行平方计算,偶数跳过
odd_square = [x ** 2 for x in range (1, 11) if x % 2 == 1] print ("1-10 奇数平方:", odd_square) # [1, 9, 25, 49, 81]
需求:从分数列表中筛选出大于等于 70 的及格分数 scores = [66, 82, 59, 91, 75, 48] if s >= 70:只留下 70 分及以上的数字 pass_score = [s for s in scores if s>= 70] print ("及格分数:", pass_score) # [82, 91, 75]
====================== if else 双分支 全部元素保留,分两种方式处理 ====================== 需求:1~6 中,偶数乘以 2,奇数保持原样 结构:满足条件执行 x*2,不满足执行 x,最后全部放进列表 branch_num = [x * 2 if x % 2 == 0 else x for x in range (1, 7)] print ("偶数 ×2,奇数不变:", branch_num) # [1, 4, 3, 8, 5, 12]
需求:给数字打标签,大于 5 写 "大",小于等于 5 写 "小" tag_list = ["大" if x> 5 else "小" for x in range (1, 10)] print ("数字大小标记:", tag_list)
# [' 小 ',' 小 ',' 小 ',' 小 ',' 小 ',' 大 ',' 大 ',' 大 ',' 大 ']
====================== 字符串专用推导式 处理文字列表 ====================== word_list = ["apple", "Banana", "cat", "Orange"] 需求:把列表里所有单词全部转换成大写字母 word.upper ():字符串自带方法,转大写 upper_words = [word.upper () for word in word_list] print ("全部大写:", upper_words)
# ['APPLE', 'BANANA', 'CAT', 'ORANGE']
需求:只保留字符长度超过 4 个的单词 len (w) 获取单词字母数量,大于 4 才留下 long_word = [w for w in word_list if len (w) > 4] print ("长度大于 4 的单词:", long_word) # ['apple', 'Banana', 'Orange']
需求:提取一句话里面所有大写英文字母 sentence = "Hello Python World" c.isupper () 判断单个字符是不是大写字母 upper_char = [c for c in sentence if c.isupper ()] print ("提取大写字母:", upper_char) # ['H', 'P', 'W']
====================== 双层循环推导式 两组数据两两配对 ====================== group1 = [1, 2] group2 = ["a", "b"] 外层循环 x 取 1、2,内层循环 y 依次取 a、b,两两组合成元组 pair_list = [(x, y) for x in group1 for y in group2] print ("双层循环配对:", pair_list) # [(1,'a'),(1,'b'),(2,'a'),(2,'b')]
需求:生成 0~2 所有横纵坐标组合,用于画网格坐标 point = [(x, y) for x in range (3) for y in range (3)] print ("3×3 坐标集合:", point) [(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
====================== 搭配字典,提取符合条件的键 / 值 ====================== 字典:水果名称:单价 fruit_price = {"苹果": 8, "香蕉": 3, "草莓": 12, "橘子": 5} .items () 同时取出字典的水果名、对应价格 判断价格大于 6,符合条件就保存水果名称 expensive_fruit = [fruit for fruit, price in fruit_price.items () if price > 6] print ("单价 6 元以上水果:", expensive_fruit) # [' 苹果 ', ' 草莓 ']
====================== 推导式 VS 普通 for 循环(方便理解等价逻辑) ====================== 推导式写法:一行完成过滤 + 计算 demo_comp = [x*3 for x in range(1, 6) if x % 2 == 1] 传统多行 for 循环写法,和上面推导式效果完全一样 demo_normal = [] # 先创建空列表 for x in range (1, 6): # 逐个取出数字 if x % 2 == 1: # 判断是否奇数 demo_normal.append (x*3) # 奇数乘 3,添加到列表 print ("推导式结果:", demo_comp) # [3, 9, 15] print ("普通循环结果:", demo_normal) # [3, 9, 15]