关键词:
目录
很多同学在从其他语言转向 Python 时,往往容易不假思索地写出一些冗余的代码。这是由于他们没有深入地学习和掌握 Python 的语法特点,只是在机械地使用从其他语言继承而来的思想编写 Python 程序。
事实上,Python 是一种重应用而轻底层的语言,因此 Python 程序的编写者往往不需要过多地关注底层逻辑,而专注于业务逻辑,Python 编写的程序也常常具有简单、清晰、优美、优雅的特点。
在 Python 中,有一种构建列表的方式,可以用一行代码代替传统的复杂写法。这种特性叫做列表解析(list comprehension)。
本文中,我将向你介绍列表解析式,并通过大量的实用案例,向你展示如何利用列表解析式编写一行更比九行强的 Pythonic 代码。
一、列表解析式介绍
列表解析式的语法形式为:
[expression for expr1 in sequence1 if condition1
for expr2 in sequence2 if condition2
for expr3 in sequence3 if condition3
...
for exprN in sequenceN if conditionN]
引例1
对于抽象的语法形式,多说无益,让我们直接通过具体的例子带你进入列表解析式的世界:
输入一个正整数 n ,计算 的和,要求用一行代码实现。
参考代码:
print(sum([1 / i for i in range(1, eval(input()) + 1)]))
从上面这行代码可以看到,就是传说中的“列表解析式”。
这段列表解析式非常容易阅读,它的意思是,利用 for 循环 for i in range(1, eval(input()) + 1) 中的 1 / i 生成一个列表。
之后,将这个列表传入一个 sum() 函数中,该函数对列表里的所有值求和,最后使用 print() 函数把列表打印出来。
由以上的例子,我们可以很轻松地理解到,列表解析式的主要功能是生成一个新列表,但必须基于使用 for 循环遍历一个已有的 “可迭代” 对象。用一句不太恰当的总结来讲,列表解析式就是从一个已有的列表生成另一个列表。
有了以上的认识,我们再看一个引例。
引例2
打印 0 到 200 之间的所有能被 2 或 3 整除的数,要求用一行代码实现。
参考代码:
print([i for i in range(200) if i % 2 == 0 or i % 3 == 0])
是本道题目中出现的列表解析式。和上个例子相比,本次的列表解析式多了一个 if 的判断结构,它的意思是满足指定的条件才将元素放进新的列表中。
基于上面两个引例,我们已经知道了列表解析式的语法和用途,接下来,我将通过一系列例子,帮助你巩固学习列表解析式。
例题的难度从简单向困难逐渐过渡,建议在看完例题后先自行尝试,然后再和答案比对,这样可以学到更多。
二、一系列例题
以下例题均使用一行完成哦:
例题1 国王与阿凡提
阿凡提与国王比赛下棋,国王说要是自己输了的话阿凡提想要什么他都可以拿得出来。阿凡提说那就要点米吧,棋盘一共 64 个小格子,在第一个格子里放 1 粒米,第二个格子里放 2 粒米,第三个格子里放 4 粒米,第四个格子里放 8 粒米,以此类推,后面每个格子里的米都是前一个格子里的 2 倍,一直把 64 个格子都放满。需要多少粒米呢?
参考代码:
sum([2**i for i in range(64)])
例题2 过滤掉不符合条件的元素
给定一个列表:
aList = [-1, -4, 6, 7.5, -2.3, 9, -11]
要求过滤掉该列表中所有的负数。
参考代码:
aList = [i for i in aList if i>0]
例题3 打印所有大写字母
已知 'a' 的 ASCII 码值为 65,请打印所有小写字母。
参考代码:
print("".join(chr(i) for i in range(65,91)))
例题4 找到所有的素数
请打印200以内的所有素数。
参考代码:
[p for p in range(2, 200) if 0 not in [p%d for d in range(2, int(p**0.5) + 1)]]
例题5 生成一个随机数矩阵
生成一个6行5列的随机数矩阵。
参考代码:
[[random() for j in range(5)] for i in range(6)]
例题6 对列表元素进行批量类型转换
给定一个包含8个字符串的列表:
aList = ["1", "2", "3", "4", "5", "6", "7", "8"]
实际上这些字符串的内容都是整数,因此需要你将这个列表中的字符串都转换为整型。
参考代码:
aList = [int(item) for item in aList]
PS:
这道题目使用 map() 函数其实也是不错的选择:
aList = list(map(int, aList))
例题7 输出最大元素的下标
已知一个列表 ls,其中装有若干个数字。要求你找到最大的数字,并输出它们的下标。(注意,最大的数字可能不止一个。)
参考代码:
print([index for (index,item) in enumerate(ls) if item == max(ls)]
例题8 在字典中根据值找键
在 Python 中,我们可以轻易地通过字典的键找到对应的值,但通过值找到对应的键却没那么容易。而且同一个值可能会有多个键与之对应。
现给定一个字典 dct ,要求通过值 aValue 找到所有与之对应的键。
参考代码:
[x for (x,y) in dct.items() if y == aValue]
例题9 打印九九乘法表
请打印九九乘法表。
参考代码:
print('\\n'.join(['\\t'.join(["%2s *%2s = %2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))
三、总结
通过以上一系列例题的练习,相信你对 Python 中的列表解析式用法已经能够熟练使用了。列表解析式无论是在平时的编码,还是在找工作时的面试中,都是十分重要、能够有效提升代码逼格、减少代码体积的强大特性,以后能用一行代码解决的,千万别敲回车!
本专栏将持续更新,关注我,继续带你体验更多 Python 技巧!
千万别再傻傻地自学编程了,程序员:这都是别人玩剩下的(代码片段)
...了,这都是别人玩剩下的,这是真的吗?我做python有2年时间了,自己对编程也感兴趣,所以今天来讲述一下:当初作为小白,是怎么学习Python的。首先,先给一个福利哈,因为做了这么多年的Py... 查看详情
千万别再瞎学python了,过来人的一些学习经验,能让你少走很多弯路!(代码片段)
...好啊!前几天我在CSDN上发布了第一篇博客:自学Python6个月,找到了月薪8K的工作,多亏了这套学习方式!收获了500多的粉丝(俺也是有粉丝的人啦),实在让我惊喜万分!有不少粉丝私信问我... 查看详情
豆瓣top3的python书,千万别错过
在8月初的TIOBE编程语言排行榜中,Python在众多编程语言中一路飙升,市场份额占比达到了15.42%,创下历史新高。就连TIOBE的CEO都说:“现在很难找到一个没有广泛使用Python的编程领域了。”看起来确实没有什么能... 查看详情
java中equals的这些坑,千万别踩。。。(代码片段)
来源:cnblogs.com/juncaoit/p/12422752.html一直以为这个方法是java8的,今天才知道是是1.7的时候,然后翻了一下源码。这篇文章中会总结一下与a.equals(b)的区别,然后对源码做一个小分析。值是null的情况1、a.equals(b),a是nul... 查看详情
千万别点这些手机使用功能!殊不知你的隐私财产就没了!
...上也方便了犯罪分子!试想别人拿你的手机不需要密码就能用你的钱,所以还是关闭免密支付比较安全!3.USB调试功能千万别点这些手机使用功能!殊不知你的隐私财产就没了!安卓手机要注意!手机一旦开启USB调试模式,手机... 查看详情
为什么我劝你千万别靠接单赚钱?
大家好,我是一行很多人在学习python都想着的是去报个培训,然后靠接单来赚外快虽然多年前一行学python也是冲着这个目的来的,希望学会python能够在读研的时候赚一点钱补贴生活,毕竟读研的生活费才1200元/月... 查看详情
没病千万别做外包,狗都不如!(代码片段)
...AT技术(ID:BAT_ARCH)如果有一个不用管绩效和代码质量,工作时间可以尽情摸鱼,更没有职场PUA的工作,你会考虑吗?B哥觉得,如果是刚 查看详情
巨坑警告!去银行写代码千万别去分行
上一篇:推特裁员真荒谬!按照代码行数裁掉50%的工程师,90%的经理!员工emoji群怼老马很多同学秋招时也会投银行,主要是金融科技岗,发现大部分都会要求轮岗一到两年,心中大呼实在太坑了吧ÿ... 查看详情
巨坑警告!去银行写代码千万别去分行(代码片段)
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇很多同学秋招时也会投银行,主要是金融科技岗,发现大部分都会要求轮岗一到两年,心中大呼实在太坑了吧,干两年柜员还能写得来H... 查看详情
springboot设置动态定时任务,千万别再写死了~(代码片段)
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇之前写过文章记录怎么在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态... 查看详情
python所有方向的学习路线,你们要的知识体系在这,千万别做了无用功!
前言一直以来都有很多想学习Python的朋友们问我,学Python怎么学?爬虫和数据分析怎么学?web开发的学习路线能教教我吗?我先告诉大家一个点,不管你是报了什么培训班,还是自己在通过各种渠道自学... 查看详情
python所有方向的学习路线,你们要的知识体系在这,千万别做了无用功!
前言一直以来都有很多想学习Python的朋友们问我,学Python怎么学?爬虫和数据分析怎么学?web开发的学习路线能教教我吗?我先告诉大家一个点,不管你是报了什么培训班,还是自己在通过各种渠道自学... 查看详情
千万别再傻傻地自学编程了,程序员:这都是别人玩剩下的(代码片段)
...了,这都是别人玩剩下的,这是真的吗?我做python有2年时间了,自己对编程也感兴趣,所以今天来讲述一下:当初作为小白,是怎么学习Python的。首先,先给一个福利哈,因为做了这么多年的Py... 查看详情
自学编程千万别再傻傻地读理论书,程序员:这都是别人玩剩下的(代码片段)
Python前景怎么样?当你在学习这门语言的时候,你会不会担心以后找不到一份满意的工作?事实上,人生当中,每一次的学习,最后都会让你通过这项技能,让你遇到适合自己的工作。或许在当下,... 查看详情
17岁少年重塑电动汽车“心脏”,还手握60+个工程项目!网友:“千万别让我妈看见”...(代码片段)
整理|郑丽媛出品|CSDN(ID:CSDNnews)提问:17岁的你在干什么?大多数人的17岁应该在高中主攻学习,但有人17岁却已在课余时间完成了至少60个工程项目——只能说,人和人的17岁真的不一样,活脱脱... 查看详情
springboot中使用@async的时候,千万别忘了线程池的配置!(代码片段)
上一篇我们介绍了如何使用@Async注解来创建异步任务,我可以用这种方法来实现一些并发操作,以加速任务的执行效率。但是,如果只是如前文那样直接简单的创建来使用,可能还是会碰到一些问题。存在有什... 查看详情
这8个摸鱼神器,千万别让你老板知道!
...命名rename等自然不在话下;更复杂的数据操作也可以使用一行命令轻松搞定——frequency创建频率表、replace使用正则表达式替换数据、sort特定条件排序、split文件分拆等等。Xmind思维导图Xmind是一款全功能的思维导图和头脑风暴软... 查看详情
千万别再学python了?python没用了?马上就要被淘汰啦?(代码片段)
最近,看到网上好多人站在在职程序员的角度去分析编程语言的一个优劣,劝小白学这个语言别学那个语言,这对小白来说是毫无意义的。但是它又具有极强的一个误导性。为什么呢?一、语言只是工具,解... 查看详情