首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 40个常用的列表推导式

Python 40个常用的列表推导式

作者头像
用户11081884
发布2026-07-20 19:23:04
发布2026-07-20 19:23:04
390
举报

列表推导式是Python中一种简洁、高效且极具Pythonic风格的语法结构,它允许通过一行代码快速生成、转换或过滤列表。对于数据处理、算法实现和日常脚本编写而言,掌握列表推导式能显著提升代码的可读性和执行效率。

一、 什么是列表推导式?

列表推导式(List Comprehension)是一种基于现有可迭代对象(如列表、元组、字符串、range对象等)创建新列表的简洁语法。其基本结构如下:

代码语言:javascript
复制
[expression for item in iterable if condition]
  • expression:对每个元素进行操作的表达式。
  • item:从可迭代对象中取出的元素。
  • iterable:任何可迭代对象。
  • if condition:可选的条件过滤语句。

其核心思想是:“对可迭代对象中的每个元素,如果满足某个条件,就对其应用某个表达式,并将结果收集到一个新列表中。”

二、 使用场景与优势

主要场景:

1、数据转换:将一种形式的数据批量转换为另一种形式。

2、数据过滤:从数据集中筛选出满足特定条件的子集。

3、列表初始化:快速生成具有特定规律的序列。

4、嵌套结构处理:简化对嵌套列表、字典等结构的操作。

5、替代简单的for循环:使代码更紧凑、意图更清晰。

核心优势:

  • 简洁性:用一行代码完成多行循环的工作。
  • 可读性:语法接近自然语言描述,意图明确。
  • 性能:在多数情况下,其执行速度比等效的 for 循环更快,因为其底层实现进行了优化。

三、 40个常用列表推导式示例

1. 生成数字序列

代码语言:javascript
复制
numbers = [x for x in range(10)]
# 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2. 生成平方列表

代码语言:javascript
复制
squares = [x**2 for x in range(10)]
# 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

3. 生成立方列表

代码语言:javascript
复制
cubes = [x**3 for x in range(1, 6)]
# 输出: [1, 8, 27, 64, 125]

4. 生成指定步长的序列

代码语言:javascript
复制
even_numbers = [x for x in range(0, 20, 2)]
# 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

5. 类型转换(字符串转整数)

代码语言:javascript
复制
str_nums = ["10", "20", "30"]
int_nums = [int(num) for num in str_nums]
# 输出: [10, 20, 30]

6. 类型转换(整数转字符串)

代码语言:javascript
复制
int_nums = [10, 20, 30]
str_nums = [str(num) for num in int_nums]
# 输出: ['10', '20', '30']

7. 过滤偶数

代码语言:javascript
复制
evens = [x for x in range(10) if x % 2 == 0]
# 输出: [0, 2, 4, 6, 8]

8. 过滤奇数

代码语言:javascript
复制
odds = [x for x in range(10) if x % 2 != 0]
# 输出: [1, 3, 5, 7, 9]

9. 过滤非空字符串

代码语言:javascript
复制
strings = ["hello", "", "world", None, "python"]
non_empty = [s for s in strings if s]
# 输出: ['hello', 'world', 'python']

10. 过滤特定类型元素

代码语言:javascript
复制
mixed = [1, "a", 2.5, "b", 3, None]
integers = [x for x in mixed if isinstance(x, int)]
# 输出: [1, 3]

11. 多条件筛选(与逻辑)

代码语言:javascript
复制
# 找出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. 多条件筛选(或逻辑)

代码语言:javascript
复制
# 找出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. 字符串转大写

代码语言:javascript
复制
words = ["apple", "banana", "cherry"]
upper_words = [word.upper() for word in words]
# 输出: ['APPLE', 'BANANA', 'CHERRY']

14. 字符串转小写

代码语言:javascript
复制
words = ["APPLE", "BANANA", "CHERRY"]
lower_words = [word.lower() for word in words]
# 输出: ['apple', 'banana', 'cherry']

15. 计算字符串长度

代码语言:javascript
复制
words = ["apple", "banana", "cherry"]
lengths = [len(word) for word in words]
# 输出: [5, 6, 6]

16. 提取字符串首字母

代码语言:javascript
复制
words = ["apple", "banana", "cherry"]
initials = [word[0] for word in words]
# 输出: ['a', 'b', 'c']

17. 字符串反转

代码语言:javascript
复制
words = ["hello", "world", "python"]
reversed_words = [word[::-1] for word in words]
# 输出: ['olleh', 'dlrow', 'nohtyp']

18. 按空格分割句子并处理单词

代码语言:javascript
复制
sentence = "Python is awesome and powerful"
word_lengths = [len(word) for word in sentence.split()]
# 输出: [6, 2, 7, 3, 8]

19. 标记数字奇偶性

代码语言:javascript
复制
numbers = [1, 2, 3, 4, 5]
labels = ["Even" if x % 2 == 0 else "Odd" for x in numbers]
# 输出: ['Odd', 'Even', 'Odd', 'Even', 'Odd']

20. 根据数值范围分类

代码语言:javascript
复制
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. 对元素进行条件性运算

代码语言:javascript
复制
numbers = [1, 2, 3, 4]
adjusted = [x * 2 if x % 2 == 0 else x for x in numbers]
# 输出: [1, 4, 3, 8]

22. 二维列表展开(扁平化)

代码语言:javascript
复制
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. 生成笛卡尔积

代码语言:javascript
复制
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. 生成乘法表(二维列表)

代码语言:javascript
复制
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. 转置矩阵

代码语言:javascript
复制
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获取索引和值

代码语言:javascript
复制
fruits = ["apple", "banana", "cherry"]
indexed_fruits = [(i, fruit) for i, fruit in enumerate(fruits)]
# 输出: [(0, 'apple'), (1, 'banana'), (2, 'cherry')]

27. 结合zip合并多个列表

代码语言:javascript
复制
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和自定义函数(虽然推导式本身更简洁)

代码语言:javascript
复制
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码

代码语言:javascript
复制
chars = ['a', 'b', 'c', 'A', 'B', 'C']
ascii_vals = [ord(c) for c in chars]
# 输出: [97, 98, 99, 65, 66, 67]

30. 从两个列表生成字典

代码语言:javascript
复制
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. 过滤字典项

代码语言:javascript
复制
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. 转换字典的值

代码语言:javascript
复制
original = {"a": 1, "b": 2, "c": 3}
doubled = {k: v * 2 for k, v in original.items()}
# 输出: {'a': 2, 'b': 4, 'c': 6}

33. 反转字典的键和值

代码语言:javascript
复制
original = {"a": 1, "b": 2, "c": 3}
reversed_dict = {v: k for k, v in original.items()}
# 输出: {1: 'a', 2: 'b', 3: 'c'}

34. 生成集合(去重)

代码语言:javascript
复制
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_set = {x for x in numbers}
# 输出: {1, 2, 3, 4}

35. 读取文件行并去除首尾空白

代码语言:javascript
复制
# 假设有文件 data.txt
lines = [line.strip() for line in open('data.txt', 'r', encoding='utf-8')]

36. 读取文件并过滤以特定字符开头的行

代码语言:javascript
复制
lines_starting_with_a = [line.strip() for line in open('data.txt', 'r') if line.startswith('A')]

37. 解析CSV格式字符串的特定列

代码语言:javascript
复制
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. 生成素数列表

代码语言:javascript
复制
n = 30
primes = [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. 将生成器表达式转换为列表

代码语言:javascript
复制
# 生成器表达式是惰性求值的,用list()可以立即求值
gen_exp = (x * 2 for x in range(5) if x % 2 == 0)
list_from_gen = list(gen_exp)
# 输出: [0, 4, 8]

40. 嵌套列表推导式中的条件过滤

代码语言:javascript
复制
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 循环后面进行过滤,也可以作为三元表达式放在前面进行条件赋值。

“无他,惟手熟尔”!有需要的用起来!

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 什么是列表推导式?
  • 二、 使用场景与优势
  • 三、 40个常用列表推导式示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档