Python基础列之表生成式

简介: Python基础列之表生成式

List comprehensions provide a concise way to create lists. Common applications are to make new lists where each element is the result of some operations applied to each member of another sequence or iterable, or to create a subsequence of those elements that satisfy a certain condition.


列表生成式(List Comprehensions)是Python基础,好用,而又非常重要的功能,也是最受欢迎的Python特性之一,可以说掌握它是成为合格Python程序员的基本标准。本质上可以把列表推导式理解成一种集合了变换和筛选功能的函数,通过这个函数把一个列表转换成另一个列表。注意是另一个新列表,原列表保持不变。


首先我们来瞧一行列表的代码:

>>> squares = []
>>> for x in range(10):
       squares.append(x**2)
输出:
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

对于以上这串代码,我们还可以这么去写:

squares = [x**2 for x in range(10)]
输出:
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

两者都能生成一样的结果,为什么第二种方法就能很方便,一行就搞定了?

这就是 列表生成式(也叫列表推导式,List Comprehensions)!




(1)对列表中的每项元素进行立方运算(变换功能)


a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

b = [x ** 3 for x in a if x % 2 == 0]

print(b)

[8, 64, 216, 512, 1000]

     从结果上可以看出有筛选条件的话是先筛选再变换,即先筛掉不满足条件的元素,再进行变换运算。可以同时加多个筛选条件,如对大于5的且是偶数的元素进行立方运算,示例如下:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

b = [x ** 3 for x in a if x % 2 == 0 if x > 5]

print(b)

[216, 512, 1000]

(2)与zip结合

      将a,b两个列表中相对应得值组合起来,形成一个新列表。例如包含x坐标的列表与y坐标的列表形成相对应的点坐标[x, y]列表。

a = [-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]

b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

xy = [[x, y] for x, y in zip(a, b)]

print(xy)

[[-1, 1], [-2, 2], [-3, 3], [-4, 4], [-5, 5], [-6, 6], [-7, 7], [-8, 8], [-9, 9], [-10, 10]]

(3)支持多层for循环

      将一个嵌套列表转换成一个一维列表。

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [j for i in a for j in i]
print(b)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

注意事项

1. 当需要只是执行一个循环的时候尽量使用循环而不是列表解析, 这样更符合python提倡的直观性:

for item in sequence: 
    process(item)

2. 当有内建的操作或者类型能够以更直接的方式实现的, 不要使用列表解析.

例如复制一个列表时, 使用; L1=list(L) 即可, 不必使用: L1=[x for x in L]

3. 如果需要对每个元素都调用并且返回结果时, 应使用 L1=map(f,L), 而不是 L1=[f(x) for x in L].

4. 如果表达式是一个元组(例如前面示例中的(x, y)),它必须是圆括号。

>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]
输出:
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

5.列表理解可以包含复杂的表达式和嵌套函数:

>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
输出:
['3.1', '3.14', '3.142', '3.1416', '3.14159']



      列表生成式的使用非常广泛,从实际使用经验来看,列表生成式使用的频率是非常高的,也是相当好用的。而对于列表推导式的多层for循环,尤其是3层以上的或带复杂筛选条件的,牺牲了较多的可读性,直接用多个普通for循环方式实现就可以了。

相关文章
|
5月前
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
106 1
|
5月前
|
SQL 数据采集 数据可视化
使用Python Pandas实现两表对应列相加(即使表头不同)
使用Python Pandas实现两表对应列相加(即使表头不同)
148 3
|
3月前
|
数据格式 Python
Python代码示例,读取excel表格,将行数据转为列数据。(10)
【7月更文挑战第10天】Python代码示例,读取excel表格,将行数据转为列数据。
91 2
|
3月前
|
机器学习/深度学习 缓存 安全
Python标准库中的`str`类型有一个`translate()`方法,它用于替换字符串中的字符或字符子集。这通常与`str.maketrans()`方法一起使用,后者创建一个映射表,用于定义哪些字符应该被替换。
Python标准库中的`str`类型有一个`translate()`方法,它用于替换字符串中的字符或字符子集。这通常与`str.maketrans()`方法一起使用,后者创建一个映射表,用于定义哪些字符应该被替换。
|
3月前
|
Python
【Python】已解决:(pandas读取DataFrame列报错)raise KeyError(key) from err KeyError: (‘name‘, ‘age‘)
【Python】已解决:(pandas读取DataFrame列报错)raise KeyError(key) from err KeyError: (‘name‘, ‘age‘)
114 0
|
4月前
|
存储 SQL 数据挖掘
Python 日期表制作
Python 日期表制作
47 4
|
4月前
|
自然语言处理 Python
python基于百度,哈工大等停用表进行的中文分词
python基于百度,哈工大等停用表进行的中文分词
|
4月前
|
JSON Serverless 开发工具
函数计算产品使用问题之要使用Python写入时序数据到阿里云表格存储时序表,该怎么办
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
vr&ar 索引 Python
Python基础教程(第3版)中文版 第二章列 表和元组(笔记)
Python基础教程(第3版)中文版 第二章列 表和元组(笔记)
|
5月前
|
数据挖掘 数据处理 索引
使用Python实现DataFrame中奇数列与偶数列的位置调换
使用Python实现DataFrame中奇数列与偶数列的位置调换
54 1
下一篇
无影云桌面