盘点Python列表生成式的三种方法

一、前言

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

二、案例分析

三种方法

要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))。

print(list(range(1, 11)))

如果要生成[1x1, 2x2, 3x3, …, 10x10]怎么做?

1. 方法一是循环:
1 2L = [] 3for x in range(1, 11): 4 L.append(x * x) 5print(L)

但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:

print([x * x for x in range(1, 11)])

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

for循环后面还可以加上if判断,这样就可以筛选出仅偶数的平方:

1 2for x in range(1, 11): 3 L.append(x * x) 4 5print([x * x for x in range(1, 11) if x % 2 == 0])

2. 使用两层循环,可以生成全排列
1 2L = [] 3for x in range(1, 11): 4 L.append(x * x) 5 6print( [m + n for m in 'ABC' for n in 'XYZ'])

三层和三层以上的循环就很少用到了。

3. 运用列表生成式,可以写出非常简洁的代码。

例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

1 2import os # 导入os模块,模块的概念后面讲到 3 4print([d for d in os.listdir('.')]) # os.listdir可以列出文件和目录

for循环其实可以同时使用两个甚至多个变量,s比如dict的items()可以同时迭代key和value:

1 2d = {'x': 'A', 'y': 'B', 'z': 'C'} 3for k, v in d.items(): 4 print(k, '=', v)

因此,列表生成式也可以使用两个变量来生成list:

1 2d = {'x': 'A', 'y': 'B', 'z': 'C' } 3print([k + '=' + v for k, v in d.items()]

最后把一个list中所有的字符串变成小写:

1 2L = ['Hello', 'World', 'IBM', 'Apple'] 3print([s.lower() for s in L])

如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:

1 2L = ['Hello', 'World', 18, 'Apple', None] 3print([s.lower() for s in L])

使用内建的isinstance函数可以判断一个变量是不是字符串:

1 2x = 'abc' 3y = 123 4print(isinstance(x, str)) 5 6print(isinstance(y, str))

三、练习和思考

请修改列表生成式,通过添加if语句保证列表生成式能正确地执行。

1 2# -*- coding: utf-8 -*- 3L1 = ['Hello', 'World', 18, 'Apple', None] 4L2=??? 5 6# 期待输出: ['hello', 'world', 'apple'] 7print(L2)

练习参考代码 :

L2 =[s.lower() for s in L1 if isinstance(s, str) ]

运行结果:

注:

运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

四、总结

本文基于Python基础,介绍了列表生成式,以案例为主,三种方法进行讲解。

分析不同方法的实现一样的效果。实际案例中需要注意的点,遇到的难点,提供有效的解决方法。最后通过练习和思考,对列表生成式加深理解。

欢迎大家积极尝试,有时候看到别人实现起来很简单,但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

代码很简单,希望对你学习有帮助。

-------------------********************************** End **********-------------**-----********-**********************************

往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/HTamPNXgBrE1Flr3xl6AzQ,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap