本文共 2354 字,大约阅读时间需要 7 分钟。
列表推导式(List Comprehensions)是Python编程语言中的一个强大工具,能够在代码中以简洁的方式处理数据转换和过滤任务。以下是关于列表推导式的详细介绍和实践指南。
列表推导式是一种Python特有的语法结构,用于从一个数据序列构建另一个新的数据序列。它结合了循环和条件判断的功能,能够在代码中简化数据处理流程。列表推导式的语法格式如下:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
优化简单循环:
考虑一个示例:从一个列表中提取所有整数,并将其平方。传统的方法需要使用for循环和条件判断,而列表推导式可以大大简化代码。
a = [1, 2, 3, 'a', 'b', 'c']b = [i**2 for i in a if isinstance(i, int)]print(b) # 输出:[1, 4, 9]
优化两层循环:
生成两个列表中对应索引相同的元素对,可以使用双重列表推导式:
a = [1, 2, 3, 4, 5, 6, 7]b = [1, 2, 3, 4, 7, 7, 7]c = [(x, y) for x in a for y in b if x == y]print(c) # 输出:[(1, 1), (2, 2), (3, 3), (4, 4), (7, 7), (7, 7), (7, 7)]
矩阵按列读取:
从一个二维列表中按列读取数据,可以通过嵌套列表推导式实现:
vec = [[1,2,3], [4,5,6], [7,8,9]]y = [j for i in vec for j in i]print(y) # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
实现嵌套列表的平铺:
将一个二维列表展开成一维列表:
vec = [[1,2,3], [4,5,6], [7,8,9]]y = [j for i in vec for j in i]print(y) # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]
过滤不符合条件的元素:
从一个列表中筛选出符合条件的元素:
my_list = [1, 2, 3]new_list = [item for item in my_list if item > 1]print(new_list) # 输出:[2, 3]
生成100以内的素数:
使用试除法生成素数列表:
import numpy as npa = [x for x in range(2, 101) if 0 not in [x%i for i in range(2, int(np.sqrt(x)))]]print(a) # 输出:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
嵌套列表推导式:
生成三维列表:
nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3)]print(nn_list) # 输出:[...]
条件过滤在嵌套结构中:
在嵌套列表推导式中添加条件过滤:
nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3) if x > 1 and y > 1]print(nn_list) # 输出:[...]
比较列表推导式和for循环的性能:
import timedef demo1(): new_list = [] for i in range(10000000): new_list.append(i * 2)def demo2(): new_list = [i * 2 for i in range(10000000)]s_time1 = time.perf_counter()demo1()e_time1 = time.perf_counter()print('demo1运行时间:', e_time1 - s_time1)s_time2 = time.perf_counter()demo2()e_time2 = time.perf_counter()print('demo2运行时间:', e_time2 - s_time2) 结果显示:列表推导式在处理大量数据时效率更高。
通过实践和不断探索,熟悉列表推导式的语法和使用场景,可以显著提升Python代码的效率和可读性。在实际项目中,合理运用列表推导式能够简化代码结构,提高开发效率。
转载地址:http://waafk.baihongyu.com/