玩转python列表解析式能用一行代码写的,千万别敲回车!(代码片段)

没头发的米糊 没头发的米糊     2023-01-14     781

关键词:

目录

一、列表解析式介绍

引例1

引例2

二、一系列例题

例题1 国王与阿凡提

例题2 过滤掉不符合条件的元素

例题3 打印所有大写字母

例题4 找到所有的素数

例题5 生成一个随机数矩阵

例题6 对列表元素进行批量类型转换

例题7 输出最大元素的下标

例题8 在字典中根据值找键

例题9 打印九九乘法表

三、总结


很多同学在从其他语言转向 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开发的学习路线能教教我吗?我先告诉大家一个点,不管你是报了什么培训班,还是自己在通过各种渠道自学&#x... 查看详情

python所有方向的学习路线,你们要的知识体系在这,千万别做了无用功!

前言一直以来都有很多想学习Python的朋友们问我,学Python怎么学?爬虫和数据分析怎么学?web开发的学习路线能教教我吗?我先告诉大家一个点,不管你是报了什么培训班,还是自己在通过各种渠道自学&#x... 查看详情

千万别再傻傻地自学编程了,程序员:这都是别人玩剩下的(代码片段)

...了,这都是别人玩剩下的,这是真的吗?我做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没用了?马上就要被淘汰啦?(代码片段)

最近,看到网上好多人站在在职程序员的角度去分析编程语言的一个优劣,劝小白学这个语言别学那个语言,这对小白来说是毫无意义的。但是它又具有极强的一个误导性。为什么呢?一、语言只是工具,解... 查看详情