Python列表推导式的10个高级技巧
Orion K Lv6

Python列表推导式的10个高级技巧

作为Python开发者,列表推导式是我日常编码中最常用的特性之一。它不仅让代码更简洁,还能提高执行效率。今天我想分享一些列表推导式的高级技巧,帮助你写出更优雅、更高效的Python代码。

1. 嵌套列表推导式

嵌套列表推导式可以用来处理多维数据结构:

1
2
3
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]

2. 条件过滤

在列表推导式中使用条件语句过滤元素:

1
2
3
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [x for x in numbers if x % 2 == 0]
# 结果: [2, 4, 6, 8, 10]

3. 条件表达式(三元运算符)

在列表推导式中使用条件表达式进行转换:

1
2
3
numbers = [1, 2, 3, 4, 5]
result = ["偶数" if x % 2 == 0 else "奇数" for x in numbers]
# 结果: ['奇数', '偶数', '奇数', '偶数', '奇数']

4. 集合和字典推导式

类似的语法也适用于创建集合和字典:

1
2
3
4
5
6
7
# 集合推导式
unique_squares = {x**2 for x in range(10)}
# 结果: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

# 字典推导式
square_dict = {x: x**2 for x in range(5)}
# 结果: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

5. 使用zip合并多个列表

1
2
3
4
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
people = [(name, age) for name, age in zip(names, ages)]
# 结果: [('Alice', 25), ('Bob', 30), ('Charlie', 35)]

6. 生成器表达式节省内存

对于大型数据集,使用生成器表达式可以节省内存:

1
2
3
4
5
# 列表推导式会一次性生成所有元素
sum_squares_list = sum([x**2 for x in range(1000000)])

# 生成器表达式会按需生成元素,节省内存
sum_squares_gen = sum(x**2 for x in range(1000000))

7. 处理嵌套结构

处理JSON等嵌套数据结构:

1
2
3
4
5
6
7
8
data = [
{'name': 'Alice', 'skills': ['Python', 'SQL']},
{'name': 'Bob', 'skills': ['Java', 'C++', 'Python']},
{'name': 'Charlie', 'skills': ['JavaScript', 'HTML']}
]

python_users = [person['name'] for person in data if 'Python' in person['skills']]
# 结果: ['Alice', 'Bob']

8. 使用enumerate获取索引

1
2
3
fruits = ['apple', 'banana', 'cherry']
indexed_fruits = [f"{i}: {fruit}" for i, fruit in enumerate(fruits, 1)]
# 结果: ['1: apple', '2: banana', '3: cherry']

9. 列表推导式中的函数调用

1
2
3
4
5
import re

texts = ["hello world", "python is great", "coding in python"]
word_counts = [len(re.findall(r'\w+', text)) for text in texts]
# 结果: [2, 3, 3]

10. 多重条件过滤

1
2
3
numbers = list(range(1, 101))
filtered = [x for x in numbers if x % 3 == 0 and x % 5 == 0]
# 结果: [15, 30, 45, 60, 75, 90]

性能考虑

列表推导式通常比等效的for循环快,但并不总是最佳选择。对于非常复杂的操作,传统的for循环可能更易读和维护。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 性能测试
import timeit

# 使用列表推导式
list_comp_time = timeit.timeit('[x**2 for x in range(1000)]', number=10000)

# 使用for循环
loop_time = timeit.timeit(
'''
result = []
for x in range(1000):
result.append(x**2)
''',
number=10000
)

print(f"列表推导式: {list_comp_time:.6f}秒")
print(f"For循环: {loop_time:.6f}秒")

结论

列表推导式是Python中非常强大的特性,掌握这些技巧可以让你的代码更加简洁、高效。但也要记住,代码的可读性同样重要,不要为了使用列表推导式而牺牲代码的清晰度。

希望这些技巧对你有所帮助!你有什么常用的列表推导式技巧吗?欢迎在评论区分享。

本站由 提供部署服务