列表推导式是Python中一种简洁、高效且极具Pythonic风格的语法结构,它允许通过一行代码快速生成、转换或过滤列表。对于数据处理、算法实现和日常脚本编写而言,掌握列表推导式能显著提升代码的可读性和执行效率。
一、 什么是列表推导式?
列表推导式(List Comprehension)是一种基于现有可迭代对象(如列表、元组、字符串、range对象等)创建新列表的简洁语法。其基本结构如下:
[expression for item in iterable if condition]
其核心思想是:“对可迭代对象中的每个元素,如果满足某个条件,就对其应用某个表达式,并将结果收集到一个新列表中。”
二、 使用场景与优势
主要场景:
1、数据转换:将一种形式的数据批量转换为另一种形式。
2、数据过滤:从数据集中筛选出满足特定条件的子集。
3、列表初始化:快速生成具有特定规律的序列。
4、嵌套结构处理:简化对嵌套列表、字典等结构的操作。
5、替代简单的for循环:使代码更紧凑、意图更清晰。
核心优势:
三、 40个常用列表推导式示例
1. 生成数字序列
numbers = [x for x in range(10)]# 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2. 生成平方列表
squares = [x**2 for x in range(10)]# 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3. 生成立方列表
cubes = [x**3 for x in range(1, 6)]# 输出: [1, 8, 27, 64, 125]
4. 生成指定步长的序列
even_numbers = [x for x in range(0, 20, 2)]# 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
5. 类型转换(字符串转整数)
str_nums = ["10", "20", "30"]int_nums = [int(num) for num in str_nums]# 输出: [10, 20, 30]
6. 类型转换(整数转字符串)
int_nums = [10, 20, 30]str_nums = [str(num) for num in int_nums]# 输出: ['10', '20', '30']
7. 过滤偶数
evens = [x for x in range(10) if x % 2 == 0]# 输出: [0, 2, 4, 6, 8]
8. 过滤奇数
odds = [x for x in range(10) if x % 2 != 0]# 输出: [1, 3, 5, 7, 9]
9. 过滤非空字符串
strings = ["hello", "", "world", None, "python"]non_empty = [s for s in strings if s]# 输出: ['hello', 'world', 'python']
10. 过滤特定类型元素
mixed = [1, "a", 2.5, "b", 3, None]integers = [x for x in mixed if isinstance(x, int)]# 输出: [1, 3]
11. 多条件筛选(与逻辑)
# 找出10以内能被2和3同时整除的数numbers = [x for x in range(10) if x % 2 == 0 if x % 3 == 0]# 等价于 if x % 2 == 0 and x % 3 == 0# 输出: [0, 6]
12. 多条件筛选(或逻辑)
# 找出10以内能被2或3整除的数numbers = [x for x in range(10) if x % 2 == 0 or x % 3 == 0]# 输出: [0, 2, 3, 4, 6, 8, 9]
13. 字符串转大写
words = ["apple", "banana", "cherry"]upper_words = [word.upper() for word in words]# 输出: ['APPLE', 'BANANA', 'CHERRY']
14. 字符串转小写
words = ["APPLE", "BANANA", "CHERRY"]lower_words = [word.lower() for word in words]# 输出: ['apple', 'banana', 'cherry']
15. 计算字符串长度
words = ["apple", "banana", "cherry"]lengths = [len(word) for word in words]# 输出: [5, 6, 6]
16. 提取字符串首字母
words = ["apple", "banana", "cherry"]initials = [word[0] for word in words]# 输出: ['a', 'b', 'c']
17. 字符串反转
words = ["hello", "world", "python"]reversed_words = [word[::-1] for word in words]# 输出: ['olleh', 'dlrow', 'nohtyp']
18. 按空格分割句子并处理单词
sentence = "Python is awesome and powerful"word_lengths = [len(word) for word in sentence.split()]# 输出: [6, 2, 7, 3, 8]
19. 标记数字奇偶性
numbers = [1, 2, 3, 4, 5]labels = ["Even" if x % 2 == 0 else "Odd" for x in numbers]# 输出: ['Odd', 'Even', 'Odd', 'Even', 'Odd']
20. 根据数值范围分类
values = [5, 12, 8, 20, 3]categories = ["High" if v > 10 else "Medium" if v > 5 else "Low" for v in values]# 输出: ['Low', 'High', 'Medium', 'High', 'Low']
21. 对元素进行条件性运算
numbers = [1, 2, 3, 4]adjusted = [x * 2 if x % 2 == 0 else x for x in numbers]# 输出: [1, 4, 3, 8]
22. 二维列表展开(扁平化)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]flattened = [num for row in matrix for num in row]# 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
23. 生成笛卡尔积
colors = ["red", "green"]sizes = ["S", "M", "L"]products = [(color, size) for color in colors for size in sizes]# 输出: [('red', 'S'), ('red', 'M'), ('red', 'L'), ('green', 'S'), ('green', 'M'), ('green', 'L')]24. 生成乘法表(二维列表)
multiplication_table = [[i * j for j in range(1, 4)] for i in range(1, 4)]# 输出: [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
25. 转置矩阵
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]transposed = [[row[i] for row in matrix] for i in range(len(matrix[0](@ref))]# 输出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
26. 结合enumerate获取索引和值
fruits = ["apple", "banana", "cherry"]indexed_fruits = [(i, fruit) for i, fruit in enumerate(fruits)]# 输出: [(0, 'apple'), (1, 'banana'), (2, 'cherry')]
27. 结合zip合并多个列表
names = ["Alice", "Bob", "Charlie"]ages = [25, 30, 35]combined = [(name, age) for name, age in zip(names, ages)]# 输出: [('Alice', 25), ('Bob', 30), ('Charlie', 35)]28. 结合map和自定义函数(虽然推导式本身更简洁)
def add_suffix(word): return word + "_processed"words = ["data", "text", "file"]processed = [add_suffix(w) for w in words]# 输出: ['data_processed', 'text_processed', 'file_processed']
29. 使用ord获取字符的ASCII码
chars = ['a', 'b', 'c', 'A', 'B', 'C']ascii_vals = [ord(c) for c in chars]# 输出: [97, 98, 99, 65, 66, 67]
30. 从两个列表生成字典
keys = ["name", "age", "city"]values = ["Alice", 25, "New York"]my_dict = {k: v for k, v in zip(keys, values)}# 输出: {'name': 'Alice', 'age': 25, 'city': 'New York'}31. 过滤字典项
original = {"a": 1, "b": 2, "c": 3, "d": 4}filtered = {k: v for k, v in original.items() if v > 2}# 输出: {'c': 3, 'd': 4}32. 转换字典的值
original = {"a": 1, "b": 2, "c": 3}doubled = {k: v * 2 for k, v in original.items()}# 输出: {'a': 2, 'b': 4, 'c': 6}33. 反转字典的键和值
original = {"a": 1, "b": 2, "c": 3}reversed_dict = {v: k for k, v in original.items()}# 输出: {1: 'a', 2: 'b', 3: 'c'}34. 生成集合(去重)
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]unique_set = {x for x in numbers}# 输出: {1, 2, 3, 4}35. 读取文件行并去除首尾空白
# 假设有文件 data.txtlines = [line.strip() for line in open('data.txt', 'r', encoding='utf-8')]36. 读取文件并过滤以特定字符开头的行
lines_starting_with_a = [line.strip() for line in open('data.txt', 'r') if line.startswith('A')]37. 解析CSV格式字符串的特定列
csv_data = "1,John,Doe\n2,Jane,Smith\n3,Bob,Johnson"last_names = [row.split(",")[2] for row in csv_data.split("\n")]# 输出: ['Doe', 'Smith', 'Johnson']38. 生成素数列表
n = 30primes = [x for x in range(2, n) if all(x % y != 0 for y in range(2, int(x**0.5)+1))]# 输出: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
39. 将生成器表达式转换为列表
# 生成器表达式是惰性求值的,用list()可以立即求值gen_exp = (x * 2 for x in range(5) if x % 2 == 0)list_from_gen = list(gen_exp)# 输出: [0, 4, 8]
40. 嵌套列表推导式中的条件过滤
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]# 只取每个子列表中的偶数even_matrix = [[num for num in row if num % 2 == 0] for row in matrix]# 输出: [[2], [4, 6], [8]]
列表推导式是Python编程中一项强大而优雅的工具。它在序列生成、数据转换、过滤、字符串处理、字典操作乃至文件读取等方方面都有应用。熟练掌握列表推导式,能让Python代码更加简洁、高效和富有表现力。
1、保持简洁:如果推导式变得过于复杂、嵌套过深或难以一眼看懂,考虑拆分成多行 for 循环,以保证代码的可维护性。
2、注意可读性:在 expression 部分避免编写过于复杂的逻辑。
3、性能考量:对于非常大的数据集,虽然列表推导式通常较快,但它会立即生成整个列表并占用内存。如果只需要迭代一次且数据量巨大,考虑使用生成器表达式( (x for x in iterable) ),它是惰性求值的,更节省内存。
4、善用条件: if 条件可以放在 for 循环后面进行过滤,也可以作为三元表达式放在前面进行条件赋值。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
------加入知识场与更多人一起学习------https://ima.qq.com/wiki/?shareId=f2628818f0874da17b71ffa0e5e8408114e7dbad46f1745bbd1cc1365277631c
https://ima.qq.com/wiki/?shareId=66042e013e5ccae8371b46359aa45b8714f435cc844ff0903e27a64e050b54b5