Python列表推导式、字典推导式、集合推导式

几个月前,我在PTA这个编程题练习网站上,把PAT (Basic Level) Practice里面的题目都做了一遍,里面有很多题目,都是一行要输入几个用空格分开的数字。刚开始做的时候,我并没有接触到推导式这个东西,于是乎,每次在进行这种输入的时候,都会用到之前知晓的这个代码list(map(int,input().split())),来使输入内容变成一个元素是数字的列表,因为直接用input().split()会使元素是字符串。但好景不长,在遇到要写较多代码,或者数据较大的题目时,这串代码就会出现运行时间超时的问题。此时,我不得不去寻找新的办法,于是我就接触到了列表推导式,用[int(i) for i in input().split()]可以完美解决超时的问题。

列表推导式

你应该知道,编写这样的代码很痛苦:

>>> ls = []
>>> for i in range(9):
	if i % 2 == 0:
		ls.append(i)
		
>>> ls
[0, 2, 4, 6, 8]

这种写法或许用于C语言不错,但在Python中,运行速度很慢,因为解释器在每次循环的时候都要判断序列中的哪一部分需要修改,需要用计数器来跟踪需要处理的元素,而且每次遍历因为append()方法还要额外执行查询函数。而列表推导式就能解决这些问题,它可以使用编排好的功能对上述语法的一部分进行自动化处理。

>>> ls = [i for i in range(9) if i % 2 ==0]
>>> ls
[0, 2, 4, 6, 8]

很明显,列表推导式不仅更加高效,也更加剪短,涉及的语法元素也更少,在大型程序中,也能出现更少的错误。

字典推导式

字典推导式和列表推导式使用方法类似,只是用的是大括号。字典推导式更多的是用于key和value的对调,合并大小写对应的value值,将k统一成小写。

>>> dl = {'a':1, 'b':2, 'c':3}
>>> dl_replace = {v:k for k, v in dl.items()}
>>> dl_replace
{1: 'a', 2: 'b', 3: 'c'}
>>> dl = {'a':1, 'b':25, 'A':124, 'E':21}
>>> dl_merge = {k.lower(): dl.get(k.lower(), 0) + dl.get(k.upper(), 0) for k in dl.keys()}
>>> dl_merge
{'a': 125, 'b': 25, 'e': 21}

集合推导式

集合推导式自带去重的功能。

>>> sl = {i**2 for i in range(-2, 3)}
>>> sl
{0, 1, 4}
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注