玩转 Python 列表解析式能用一行代码写的,千万别敲回车!
Posted 没头发的米糊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转 Python 列表解析式能用一行代码写的,千万别敲回车!相关的知识,希望对你有一定的参考价值。
目录
很多同学在从其他语言转向 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 列表解析式能用一行代码写的,千万别敲回车!的主要内容,如果未能解决你的问题,请参考以下文章
一行代码,用Python玩转所有的 “微信表情”,比微信表情还多!