玩转 Python 列表解析式能用一行代码写的,千万别敲回车!

Posted 没头发的米糊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转 Python 列表解析式能用一行代码写的,千万别敲回车!相关的知识,希望对你有一定的参考价值。

目录

一、列表解析式介绍

引例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 列表解析式能用一行代码写的,千万别敲回车!的主要内容,如果未能解决你的问题,请参考以下文章

Python玩转emoji表情 一行代码的事儿!

Python玩转emoji表情 一行代码的事儿!

一行代码,用Python玩转所有的 “微信表情”,比微信表情还多!

解析python中的单词列表

一行代码切换TensorFlow与PyTorch,模型训练也能用俩框架

53-python基础-python3-列表-列表解析