什么是列表推导式?🚀
列表推导式本质上就是一个简化的循环,但它更紧凑,可读性通常也更好。想象一下,你需要创建一个包含 0 到 9 的平方数的列表,用传统的 for 循环,你要这样写:
scss
squares = []
for i in range(10):
squares.append(i**2)
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
但是,用列表推导式,只需要一行代码:
ini
squares = [i**2 for i in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
看见没?代码瞬间变短了!i**2 for i in range(10) 这部分就是列表推导式的核心。
列表推导式的基本结构✨
一个列表推导式通常包含以下几个部分:
- 表达式: 你想要计算并放入新列表的值 (例如:
i**2) for循环: 用于迭代一个序列 (例如:for i in range(10))- 可选的条件判断: 用于过滤序列中的元素 (例如:
if i % 2 == 0)
完整的列表推导式结构如下:
csharp
[expression for item in iterable if condition]
举个例子,我们想要创建一个包含 0 到 9 之间所有偶数的平方的列表:
ini
even_squares = [i**2 for i in range(10) if i % 2 == 0]
print(even_squares) # 输出: [0, 4, 16, 36, 64]
实际应用场景⚙️
数据清洗
假设你有一个包含字符串的列表,但有些字符串包含额外的空格,你需要去除这些空格。
scss
strings = [" hello ", "world ", " python"]
cleaned_strings = [s.strip() for s in strings] # 用 strip() 方法去除字符串头尾空格
print(cleaned_strings) # 输出: ['hello', 'world', 'python']
数据转换
将摄氏温度转换为华氏温度。
ini
celsius = [0, 10, 20, 30, 40, 50]
fahrenheit = [(9/5)*c + 32 for c in celsius] # 华氏度 = 摄氏度 × 9/5 + 32
print(fahrenheit) # 输出: [32.0, 50.0, 68.0, 86.0, 104.0, 122.0]
过滤数据
筛选出列表中大于某个值的元素。
ini
numbers = [1, 10, 20, 30, 40, 50]
filtered_numbers = [n for n in numbers if n > 25]
print(filtered_numbers) # 输出: [30, 40, 50]
多重循环的列表推导式🤯
列表推导式也支持嵌套循环,这允许你处理更复杂的数据结构。
比如,你想创建一个包含所有 (x, y) 坐标的列表,其中 x 的范围是 0 到 2,y 的范围是 0 到 1:
erlang
coordinates = [(x, y) for x in range(3) for y in range(2)]
print(coordinates) # 输出: [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
注意,多重循环的顺序和 for 循环的顺序一致。但是!多重循环的列表推导式可能会变得难以阅读,所以要谨慎使用,确保代码清晰易懂。
列表推导式的优势和注意事项💡
优势
- 简洁: 用一行代码代替多行
for循环,代码更紧凑。 - 可读性: 对于简单的转换和过滤操作,列表推导式通常比循环更容易理解。
- 性能: 在某些情况下,列表推导式的执行效率比
for循环更高。
注意事项
- 过度使用: 列表推导式虽好,但不要滥用。对于过于复杂的逻辑,还是用
for循环更清晰。 - 可读性: 确保列表推导式易于理解。如果代码太长或太复杂,考虑拆分成多个步骤。
- 变量名: 使用有意义的变量名,提高代码的可读性。
列表推导式和其他数据结构的结合💥
集合推导式
与列表推导式类似,只不过是使用 {} 符号,结果会生成一个集合,集合会自动去重。
ini
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = {x for x in numbers} # 集合会自动去重
print(unique_numbers) # 输出: {1, 2, 3, 4, 5}
字典推导式
字典推导式使用 {}, 生成带有键值对的字典。
ini
numbers = [1, 2, 3, 4, 5]
square_dict = {x: x**2 for x in numbers}
print(square_dict) # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
集合推导式和字典推导式分别用于创建集合和字典,语法和列表推导式类似。
现在,你已经掌握了 Python 列表推导式的基本概念和用法,多多练习,让你的代码更上一层楼!