查看原文
其他

列表生成式|让你的代码更简洁

爬虫俱乐部 Stata and Python数据分析 2023-02-21

本文作者:喻淑敏,中南财经政法大学统计与数学学院

本文编辑:郭培军

技术总编:孙一博

Stata&Python云端课程来啦!

      好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程Stata进阶课程Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~


引言
现有需求如下: 假如要生成一个列表,每个元素由1-4的奇数,和1-4的偶数对应:[(1, 2), (1, 4), (3, 2), (3, 4)]
常用方法如下:
list_a=[]for i in range(1,5):    if i%2!=0:        for j in range(1,5):            if j%2==0:                list_a.append((i,j))print(list_a)
输出结果为:

一般情况下多层嵌套循环过于繁琐,缩进容易出现错误,且在复杂的业务场景下可读性较差。这里我们介绍一种新方法——列表推导式,它可以用一行语句代替多行循环生成列表,帮你结束理不清嵌套逻辑的“苦”。

一、列表推导式概述
首先,我们用列表推导式解答开篇的需求,使用列表生成式语法如下:
#(i,j)是要添加到列表的数据变量# i的取值 第一个for i in range(1,5) 条件是i%2!=0# j的取值 第二个for j in range(1,5) 条件是j%2==0list_b=[(i,j) for i in range(1,5) if i%2!=0 for j in range(1,5) if j%2==0]print(list_b)

输出结果为:

对比开篇用到的for循环嵌套易得:列表推导式代码更简洁、可读性更强。那么列表推导式是什么?其语法结构是什么?其相对于for循环的优势在何处?这些问题是小编接下来要带大家解答的。
1. 概念
  • 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
  • 运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
2. 列表生成式比for循环好在哪里?
  • 形式简洁,开发效率高
  • 性能也更加优越
start_time = time.time()lines1 = [(i,j) for i in range(1,1000) if i%2!=0 for j in range(1,1000) if j%2==0]end_time = time.time()print(end_time-start_time)print(sys.getsizeof(lines1))
start_time = time.time()lines2 =[]for i in range(1,1000): if i%2 != 0: for j in range(1,1000): if j%2 == 0: lines2.append((i,j)) end_time = time.time()print(end_time-start_time)print(sys.getsizeof(lines2))

输出结果为:

可以看到,二者所占用内存是一样的,但是列表生成式的运行时间,仅仅是for循环的60%。

归结来看,列表生成式是在生成了所有数据后,统一放进一个列表里。for循环是先建立一个列表,然后再把数据一个一个往里加。

3. 列表推导式的执行顺序

刚刚入门python的小伙伴接触列表推导式,可能会对它别样的语法结构感到疑惑,下面小编就教你轻轻松松看懂执行顺序。

列表生成式的语法格式:[expression for i in 序列 if…]   表达式+循环+条件

它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是 0 个或多个 for 或者 if 语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以 if 和 for 语句为上下文的表达式运行完成之后产生。

列表推导式的执行顺序:各语句之间是嵌套关系,左边第二个语句(for)是最外层,依次往右进一层,左边第一条语句(expression)是最后一层。


二、多种形式介绍
1. 最简形式

[表达式 for 变量 in 可迭代对象]

#生成一个1-10的列表,l1=[x for x in range(1,11)]l1
输出结果为:

2. 过滤条件形式

(1)只有if形式:

 [表达式 for 变量 in 可迭代对象 if 条件语句]

#生成一个0-9的偶数列表l2=[x for x in range(10) if x%2==0]l2

输出结果为:

(2)if-else形式:

[表达式 if 条件语句 else 条件语句 for 变量 in 可迭代对象]

#生成一个0-10的列表,其中偶数加2 ,奇数+1l3=[x+2 if x%2==0 else x+1 for x in range(11)]l3

输出结果为:

3. 循环嵌套式

[表达式 第一个for 第二个for]

l4=[(i,j) for i in range(1,5) if i%2!=0 for j in range(1,5) if j%2==0]l4
输出结果为:


三、生成式扩展

其实,不止列表有推导式,还有元组推导式、字典推导式和集合推导式,下面举几个“小栗子”看看。

1. 元组生成式

t1=tuple(x for x in range(1,5))t1
输出结果为:

2. 字典生成式

dict1={'name':'jimi','age':300}#k的值是age时产生一个新的字典d1={k:v for k,v in dict1.items() if k is 'age' }d1
输出结果为:

3. 集合生成式

l1=[1,1,2,3,4,4,4]s1={i for i in l1}s1
输出结果为:

从上面的代码可以做出如下总结:

(1)集合推导式就是将列表推导式的[]换成{},字典推导式就是推导出两个值并构建成键值对的样子;

(2)另外,不管是字典推导式还是集合推导式,后面都可以像列表推导式一样接if条件语句,嵌套循环等,具体可以根据您自己的需求来使用。

(3)值得注意的是,集合是无序且不重复的,所以会自动去掉重复的元素。

最后,留下一个嵌套列表推导式,它内含多个并列条件,宝子们可以先思考下输出结果,再动手敲下代码,检验下今天学习的成果哟!

list_a=[[x for x in range(a-3,a)] for a in range(24) if a % 3==0 and a != 0]print(list_a)


(END)
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:


最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐

Stata绘图系列——玩转绘图通用选项之坐标轴

        玩转地图的好帮手--pyecharts

       爬虫俱乐部又又又输送了一位研究助理!!!      【数据分析】一文教你玩转DataFrame

 震惊,爬虫俱乐部竟是这样运营答疑群的?!

【数据分析-入门】一看就会!Numpy的创建、索引、切片与更新

带你玩转Stata编码一言不合就teamviewer

【基础篇】循环语句的continue与break

        教你用Stata爬取全国疫情风险地区数据,原来这么简单!【数据结构】集合的使用方法      Stata爬取七普人口数据

       浅析Python的序列化与反序列化

     爬虫俱乐部的精彩答疑--爬虫为何失败?

       利用Stata批量制作学生证     【数据分析-入门】科学计算基本库—Numpy的简单使用      Stata绘图系列——玩转绘图通用选项之图例     【基础篇】数据类型介绍——list、tuple和range对象

覆盖北交所的“cnstock”复工了!

高考热度大数据爬虫——谁才是院校顶流

关于我们 


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

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可

以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。





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

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