查看原文
其他

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

爬虫俱乐部 Stata and Python数据分析 2022-03-15
本文作者:陈丹慧,中南财经政法大学金融学院

本文编辑:任   哲

技术总编:张馨月

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元

导读

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

勤奋的小白会这样做:
1list1=list(range(1,11))
2list2=[]
3for i in list1:
4    list2.append(i+2010)
5list2        
输出结果为:

而用列表生成式(List Comprehensions)一行就能代替上述代码:
1[i+2010 for i in range(1,11)]
输出结果为:

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

一、语法
根据Python官方文档的说明,列表生成式是一种简便快捷地创造列表的方式。它通常是用来创建一个新列表,这个新列表的元素是在可迭代对象(包括字符串、元组、列表、字典、集合等可被for遍历循环的对象)的基础上生成的。
1基本语法
[exp for iter_var in iterable]
作用过程:迭代iterable中的元素,再根据表达式exp计算出一个新值,最后将所有计算出的新值放在列表中,就生成了一个新的列表。
刚刚在导读中给大家展示了用列表生成式在list1的基础上生成list2,这里再详解一下它的作用过程:
1[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]中的负数。
1list3=[-4,-2,0,2,4]
2list4=[]
3#不用列表生成式
4for x in list3:
5    if x>=0:
6        list4.append(x)
7#使用列表生成式
8list4=[x for x in list3 if x >=0]
9list4
输出结果为:

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对应位置元素相加,代码如下:

1list5=["星期","周"]
2list6=["一","二","三","四","五","六","日"]
3list7=[]
4#不使用列表生成式
5for i in list5:
6    for j in list6:
7        list7.append("%s"%i+"%s"%j)
8#使用列表生成式
9list7=["%s"%i+"%s"%j for i in list5 for j in list6]
10list7           

最后输出结果如下:


二、应用

1字典里的应用
列表生成式结合字典的items方法,可以生成键值对列表:
1dict={"Jack":179,"Rose":172}
2list=[k+"身高为"+str(v)+"cm" for k,v in dict.items()]
3list
输出结果如下:

2批量删除空格
结合字符串的strip方法来删除原列表中所有字符串元素中的空白字符,生成一个新列表:
1list=[' 爬虫','  俱','乐部  ']
2[s.strip() for s in list2]
输出结果如下:

3输出某个目录下所有文件夹和文件名
结合os模块,列表生成式能输出某个目录下所有文件夹和文件名。
1import os
2[d for d in os.listdir("E:/Python/python基础")]
输出结果如下:
今天的介绍就到这里了。希望大家能好好应用列表生成式,让你的代码简洁又美观!之后我们还会介绍更多有趣的知识,来帮你提升效率,敬请期待哦!




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
Stata中变量观测值的亲密伙伴——levelsof命令

爬虫俱乐部开发的命令更新及常见问题说明

Seminar | 道德培训真的有用吗?

网络爬虫入门之requests 库的基本使用——以亚马逊图书界面为例
reduce()函数和filter()函数闪亮登场
“环环”入扣之foreach命令

统计年鉴数据整理小技巧

Seminar | 作为飞行员,我比别的CEO多了什么?

利用TensorFlow构建前馈神经网络

推文合集(1)| Stata学习者必看的n篇推文!

Seminar | 诚信的价值

利用tushare获取股票数据及实现可视化

从Excel到Stata的“摆渡车”——import excel命令

光阴十载,见证了《经济研究》中的“高被引”

利用tushare获取股票数据

         在Python中实现Stata的stack功能

这些年,经管类C刊都在研究什么?

Seminar | 眼见为实吗?高管面部可信度、审计师任期与审计费用

Seminar | 恐怖袭击与CEO薪酬

代码补全,主题更换,Jupyter Notebook原来可以这样用?

【爬虫实战】“双十一”微博热搜实时跟进

关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存