博客
关于我
Python进阶语法:列表推导式
阅读量:805 次
发布时间:2023-03-05

本文共 2354 字,大约阅读时间需要 7 分钟。

列表推导式的详细解析

列表推导式(List Comprehensions)是Python编程语言中的一个强大工具,能够在代码中以简洁的方式处理数据转换和过滤任务。以下是关于列表推导式的详细介绍和实践指南。

1. 列表推导式的基本概念

列表推导式是一种Python特有的语法结构,用于从一个数据序列构建另一个新的数据序列。它结合了循环和条件判断的功能,能够在代码中简化数据处理流程。列表推导式的语法格式如下:

[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
  • 迭代变量:用于遍历可迭代对象(如列表、元组等)的元素。
  • 表达式:根据迭代变量执行的操作,生成新的元素。
  • 条件表达式(可选):用于过滤不符合要求的元素。

2. 列表推导式的使用实例

2.1 数据转换

优化简单循环:

考虑一个示例:从一个列表中提取所有整数,并将其平方。传统的方法需要使用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]
2.2 数据过滤

过滤不符合条件的元素:

从一个列表中筛选出符合条件的元素:

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 np
a = [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]

3. 列表推导式的高级用法

嵌套列表推导式:

生成三维列表:

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) # 输出:[...]

4. 性能优化

比较列表推导式和for循环的性能:

import time
def 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)

结果显示:列表推导式在处理大量数据时效率更高。

5. 注意事项

  • 代码可读性:在列表推导式中嵌套过多条件可能会影响代码的可读性,建议在必要时使用条件表达式。
  • 性能优化:对于大数据量,列表推导式通常比传统的for循环更高效,但具体情况需根据实际测试判断。
  • 避免复杂嵌套:虽然列表推导式支持多层嵌套,但过度使用可能导致代码难以理解和维护。

通过实践和不断探索,熟悉列表推导式的语法和使用场景,可以显著提升Python代码的效率和可读性。在实际项目中,合理运用列表推导式能够简化代码结构,提高开发效率。

转载地址:http://waafk.baihongyu.com/

你可能感兴趣的文章
python | 如何用Python锁避免并发错误?
查看>>
python | 提升代码迭代速度的Python重载方法
查看>>
python | 深入理解Python并发编程中的GIL限制与解决方案
查看>>
Python | 爬虫实战——亚马逊搜索页监控(附详细源码)
查看>>
python | 高效使用Python工具自动生成模块文档的秘诀
查看>>
python 一个list去除另一个list中的值
查看>>
python 三大框架的 介绍。
查看>>
Python 下载的 11 种姿势,一种比一种高级!
查看>>
python读取一个文件夹下所有图片_初学Python-找出文件夹下的所有图片
查看>>
Python 中 3 个不可思议的返回功能
查看>>
python 中 dict 的另一种用法
查看>>
Python 中 PIL 读取图片出现异常旋转的解决方法
查看>>
python读取word表格内容(1)
查看>>
python 中os.path.join 双斜杠的解决办法
查看>>
python 中PIL.Image和OpenCV图像格式相互转换
查看>>
Python 中Semaphore 信号量对象、Event事件、Condition
查看>>
python 中with的使用及样例
查看>>
python读取wav文件并播放[pyaudio/wave]
查看>>
python读取txt文件的行数
查看>>
Python 中内置的最大堆 API
查看>>