[编程基础] Python列表解析总结
在本教程中,我们将学习使用Python列表解析(list comprehensions)相关知识
1 使用介绍
列表解析是一种基于现有列表创建列表的句法结构。列表解析提供了创建列表的简洁方法。通常需要创建新的列表,其中每个元素是应用于另一个序列或iterable的每个成员的某些操作的结果,或者创建满足特定条件的这些元素的子序列。
列表解析可以用于以下几个地方:
- 转换列表
- 筛选列表
列表解析的句法受集合的数学表示法的影响。Python语法的灵感来自Haskell编程语言。
如下是用于创建一组整数值的数学表示法。
S = {x² : x in {0 ... 16}}
下面的伪代码显示了列表解析的语法。它由三部分组成:for循环,可选条件和表达式。for循环遍历整个序列。对于每个循环,如果满足条件,则对表达式进行求值。如果计算出该值,它将被添加到新列表中。for循环和if条件可以有多个。
L = [expression [if condition] for variable in sequence [if condition]]
1.1 Python列表解析转换列表
下面的示例借助列表解析将一个列表转换为另一个列表。
在下面示例中,我们通过将每个元素乘以2从现有列表中创建一个新列表。
a = [1, 2, 3, 4, 5, 6]
# for e in a 循环遍历列表a,然后e每个元素都乘以2,然后将结果添加到新b列表中
b = [e * 2 for e in a]
print(b)
[2, 4, 6, 8, 10, 12]
1.2 从摄氏度计算华氏温度
以下示例显示有摄氏温度的列表。我们要创建一个新的温度表,以华氏温度表示。
celsius = [22, 28, 33, 42, 52]
fahr = [e * 9/5 + 32 for e in celsius]
print(fahr)
[71.6, 82.4, 91.4, 107.6, 125.6]
1.3 Python列表解析过滤列表
在下面的示例中,我们将使用列表解析来过滤列表。以下示例显示一个整数列表。通过过滤创建一个仅包含正整数的新列表。
a = [-4, 2, 0, -1, 12, -3]
# 为了只包括正数,使用一个if条件,该条件适用于每个元素。仅当满足条件的元素才包含在新列表中。
b = [e for e in a if e > 0]
print(b)
[2, 12]
下一个示例按元素类型过滤元素。
a = ['a', 2, 'c', 12, 3, 'd']
# 创建一个只有整数的列表
b = [e for e in a if type(e) == int]
# 创建一个只有字符串的列表
c = [e for e in a if type(e) == str]
print(b)
print(c)
[2, 12, 3]
['a', 'c', 'd']
1.4 Python列表逻辑委托函数
以下示例通过设定过滤函数获得句子中所有元音单词。
def is_vowel(c):
vowels = 'aeiou'
if c in vowels:
return True
else:
return False
sentence = 'There are eagles in the sky.'
# if将逻辑委托给is_vowel()
vowels = [c for c in sentence if is_vowel(c)]
print(vowels)
['e', 'e', 'a', 'e', 'e', 'a', 'e', 'i', 'e']
1.5 前置if条件判断
该if条件也可以放在前面。这样可以转换数据。在以下示例中,我们使用列表解析将值转换为"even" 和"odd"。
# i能整除2为even否则是odd
data = ["even" if i % 2 == 0 else "odd" for i in range(7)]
print(data)
['even', 'odd', 'even', 'odd', 'even', 'odd', 'even']
1.6 Python列表解析处理多if条件
在Python列表解析中可以使用多个if条件。
a = [9, 2, 18, 14, 22, 11, 7, 19, 23]
# 选择大于10小于20的数
b = [e for e in a if e > 10 if e < 20]
print(b)
[18, 14, 11, 19]
1.7 Python列表解析处理多个for循环
Python列表解析中可能有多个for循环。以下示例创建两个列表的笛卡尔乘积。列表解析中多个for循环类似于以下条件:
for i in a:
for j in b:
print(i,j)
a = [1, 2, 3]
b = ['A', 'B', 'C']
c = [ str(i) + j for i in a for j in b]
print(c)
['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']
以下示例为使用多for循环展平列表
nums = [[1, 2, 3], [3, 4, 5], [6, 7, 8]]
# 第一个循环遍历外部列表;第二个for循环遍历嵌套列表。
c = [ e for num in nums for e in num]
print(c)
[1, 2, 3, 3, 4, 5, 6, 7, 8]
1.8 Python嵌套列表解析
Python列表解析中的初始表达式可以是另一个列表解析结果。以下示例定义了一个矩阵,列表解析从原始矩阵创建一个转置矩阵。
M1 = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
M1_tr = [[row[i] for row in M1] for i in range(3)]
print(M1_tr)
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
1.9 埃拉托色尼筛选法
埃拉托色尼筛选法Sieve of Eratosthenes是一种古老的计算素数的算法,素数(或素数)是一个大于1的自然数,除了1和它本身之外没有正除数。以下示例计算值不大于的100的素数。
# 创建一个非素数的列表
no_primes = [j for i in range(2, 8) for j in range(i*2, 100, i)]
# 素数就是那些不包含在无素数列表中的数。
primes = [e for e in range(2, 100) if e not in no_primes]
print (primes)
[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]
2 参考
[编程基础] Python列表解析总结的更多相关文章
- python基础之列表解析
python列表解析:是一个让人欣喜的术语,你可以在一行使用一个for循环将所有的值放在一个列表之中.python列表解析属于python的迭代中的一种,相比python for循环速度会快很多. e ...
- Python列表解析与生成器表达式
Python列表解析 l = ["egg%s" %i for i in range(100) if i > 50] print(l) l= [1,2,3,4] s = 'he ...
- python列表解析补充:
python列表解析补充: # 补充: f = [x + y for x in 'ABCDE' for y in '1234567'] print(f) test = [] for x in 'ABC ...
- python 列表解析
列表解析,主要用于动态创建列表 本篇主要说一下,lambda.map().和filter()同列表解析语句之间结合的用法 列表解析的基本语法为:[expr for iter_var in iterab ...
- python 列表解析与map和filter函数
不知哪儿看到一个说法,大概是当map的函数参数可以直接引用一个已有的函数变量时(比如内建函数int,str之类的),用map更优美些,否则还是用列表解析更直观和快速. 我同意此说法. 昨天在写一个函数 ...
- 【392】Python 列表解析
参考: Python3 数据结构 | 菜鸟教程 列表推导式 列表推导式提供了从序列创建列表的简单途径.通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的 ...
- Python列表解析
列表解析 根据已有列表,高效创建新列表的方式. 列表解析是Python迭代机制的一种应用,它常用于实现创建新的列表,因此用在[]中. 语法: [expression for iter_val in i ...
- Python 列表解析list comprehension和生成表达式generator expression
如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression) (1)list ...
- Python列表解析和字典解析
python笔记_列表解析 相比于for循环,列表解析的语法是由底层c语言实现的,它和使用for循环遍历pyobject对象相比,性能会有很大的提升. 无条件子句的列表解析式 In [2]: [2*i ...
随机推荐
- 非swoole的方式实现简单的异步(nginx模式下)
set_time_limit(0);echo '任务开始'.time();/*即时打印*/register_shutdown_function([$this, "test"]);/ ...
- ubuntu20.04 利用xrandr命令修改多显示器分辨率
问题描述 笔记本是ThinkPad X1 Extreme Gen3 4K屏,外接了一个27寸的1080P显示器.目标是让两个显示器的"显示效果"分辨率能一致,就如winwods和m ...
- uoj316【NOI2017】泳池
题目链接 \(S=k\)可以拆成\(S\le k\)减去\(S\le k-1\).用\((i,j)\)表示第i行第j列. 设\(g(i,j)\)表示前i行前j列都安全其他未知满足条件的概率,\(h(i ...
- 【MySQL】01_运算符、函数
运算符 运算符是保留字或主要用于 SQL 语句的 WHERE 子句 中的字符,用于执行操作,例如:比较和算术运算. 这些运算符用于指定 SQL 语句中的条件,并用作语句中多个条件的连词. 常见运算符有 ...
- JS逆向实战8——某网实战(基于golang-colly)
其实本章算不上逆向教程 只是介绍golang的colly框架而已 列表页分析 根据关键字搜索 通过抓包分析可知 下一页所请求的参数如下 上图标红的代表所需参数 所以其实我们真正需要的也就是Search ...
- 【深入浅出 Yarn 架构与实现】2-1 Yarn 基础库概述
了解 Yarn 基础库是后面阅读 Yarn 源码的基础,本节对 Yarn 基础库做总体的介绍.并对其中使用的第三方库 Protocol Buffers 和 Avro 是什么.怎么用做简要的介绍. 一. ...
- [C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异
最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题. 后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过 ...
- 如何快捷地修改虚拟机镜像——libguestfs-tools工具集介绍
前言 在使用云服务器产品时,由于问题修复.功能添加.软件更新等原因,往往需要对已有系统镜像进行二次修改. 这种情况下,最为简单的做法是:使用原镜像创建实例,在实例中进行修改,修改完毕后再转镜像.这种做 ...
- kubernetes笔记-1-基础环境部署
一.环境信息: 操作系统:ubuntu 18.04 server amd64 docker:docker 19.03.ce kubernetes:v1.19 IP地址 主机名 角色 172.29. ...
- ubuntu 下安装串口终端
查看串口设备 # Ubuntu 22.04自动卸载CH341串口 sudo apt remove brltty ls -l /dev/ttyUSB0 # 查看串口设备添加信息 sudo dmesg | ...