博客
关于我
Python进阶语法:列表推导式
阅读量:801 次
发布时间: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 argparse模块
查看>>
Python asyncio库的学习和使用
查看>>
Python AttributeError:“dict“对象没有属性“append“
查看>>
Python base64和hashlib模块
查看>>
python basic programs
查看>>
python bert_gen.py 报错Unable to load weights from pytorch checkpoint file for......
查看>>
python binascii.Error: Incorrect padding
查看>>
Python bool() 函数能否为无效参数引发异常?
查看>>
Python C 程序子进程在“for line in iter“处挂起
查看>>
Python Celery:自动化测试平台定时任务必备的三方库
查看>>
python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令
查看>>
Python CONNECT 4 CHECK WIN函数
查看>>
python cos,Python cos(90)和cos(270)不是0
查看>>
python进阶(4):Python 脚本文件重启自身进程
查看>>
python ctypes库中动态链接库加载方式
查看>>
python cv2 图像( np array )转 HObject
查看>>
python进阶(3):文件操作
查看>>
python cv2截取不规则区域图片
查看>>
python CV2裁剪图片并保存
查看>>
python进阶(2):pyecharts使用
查看>>