列表生成式|让你的代码简洁又美观

本文作者:陈丹慧,中南财经政法大学金融学院
文字编辑:任 哲
技术总编:张馨月

导读

已知列表list1=[1,2,3,4,5,6,7,8,9,10],如果我们想把list1中每个元素都加上2010,生成一个新列表,该怎么做呢?

勤奋的小白会这样做:

list1=list(range(1,11))
list2=[]
for i in list1:
    list2.append(i+2010)
list2       
image01.png

而用列表生成式(List Comprehensions)一行就能代替上述代码:

[i+2010 for i in range(1,11)]
image02.png

是不是很神奇呢?一行代码就创造了有规律的新列表,看起来就像一根藤上结出了果实。今天,我就来带大家玩转列表生成式,掌握列表生成式的更多用法。

1.语法

根据Python官方文档的说明,列表生成式是一种简便快捷地创造列表的方式。它通常是用来创建一个新列表,这个新列表的元素是在可迭代对象(包括字符串、元组、列表、字典、集合等可被for遍历循环的对象)的基础上生成的。

(1)基本语法

[exp for iter_var in iterable]

作用过程:迭代iterable中的元素,再根据表达式exp计算出一个新值,最后将所有计算出的新值放在列表中,就生成了一个新的列表。

刚刚在导读中给大家展示了用列表生成式在list1的基础上生成list2,这里再详解一下它的作用过程:

[i+2010 for i in range(1,11)]

首先我们知道range(1,11)生成一个1到10的有序序列,它是可以被for遍历循环的。第一轮时,赋值i=1,再根据"i+2010"算出新值"2011";第二轮时,赋值i=2,再根据表达式算出新值"2012"……最后一轮时,赋值i=10,根据表达式算出的新值为"2020"。这些新值会按照顺序排列放在一个的新列表中被返回,即我们在导读中看到的输出结果。

(2)增加if语句过滤功能

[exp for iter_var in iterable if_exp]

作用过程:迭代iterable中每个元素,每次迭代都判断下if_exp表达式是否为真,如果为True则执行下一步,将返回元素通过exp得到一个新值;如果为False,则丢弃该元素,进行下一次迭代。最后,所有通过exp计算出来的新值将以一个新列表的形式返回。

我们用它来实现以下功能:过滤原列表list3=[-4,-2,0,2,4]中的负数。

list3=[-4,-2,0,2,4]
list4=[]
#不用列表生成式
for x in list3:
    if x>=0:
        list4.append(x)
#使用列表生成式
list4=[x for x in list3 if x >=0]
list4
out3.png

(3)嵌套循环

[exp for iter_var_A in iterrable_A for iter_var_B in iterable_B]

作用过程:先迭代iterable_A中的元素,每当迭代一个iterable_A中的一个元素,随之就会把iterable_B中每个元素都迭代一遍,最后根据表达式exp算出新值,并返回一个新列表。

乍一看,是不是头皮发麻。不要怕,看了下面的例子你会豁然开朗。

给定list5=["星期","周"]list6=["一","二","三","四","五","六","七"],用列表生成式生成一个新列表list7,将新列表中元素为list5,list6对应位置元素相加,代码如下:

list5=["星期","周"]
list6=["一","二","三","四","五","六","日"]
list7=[]
#不使用列表生成式
for i in list5:
    for j in list6:
        list7.append("%s"%i+"%s"%j)
#使用列表生成式
list7=["%s"%i+"%s"%j for i in list5 for j in list6]
list7           

最后输出结果如下:

out4.png

2.应用

(1)字典里的应用

列表生成式结合字典的items方法,可以生成键值对列表:

dict={"Jack":179,"Rose":172}
list=[k+"身高为"+str(v)+"cm" for k,v in dict.items()]
list

输出结果如下:

out5.png

(2)批量去空格

结合字符串的strip方法来删除原列表中所有字符串元素中的空白字符,生成一个新列表:

list=[' 爬虫','  俱','乐部  ']
[s.strip() for s in list2]

输出结果如下:

out6.png

(3)输出某个目录下所有文件夹和文件名

结合os模块,列表生成式能输出某个目录下所有文件夹和文件名

import os
[d for d in os.listdir("E:/Python/python基础")]

输出结果如下:

image23.png

今天的介绍就到这里了。希望大家能好好应用列表生成式,让你的代码简洁又美观!之后我们还会介绍更多有趣的知识,来帮你提升效率,敬请期待哦!


1ae8c76224e0e3302cd69df5cd8bb86.jpg

你可能感兴趣的:(列表生成式|让你的代码简洁又美观)