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

Karen110
• 阅读 1326

一、前言

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

二、案例分析

三种方法

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

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

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

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

1. 方法一是循环:

L = []
for x in range(1, 11):
    L.append(x * x)
print(L)

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

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

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

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

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


for x in range(1, 11):
    L.append(x * x)

print([x * x for x in range(1, 11) if x % 2 == 0])

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

2. 使用两层循环,可以生成全排列

L = []
for x in range(1, 11):
    L.append(x * x)

print( [m + n for m in 'ABC' for n in 'XYZ'])

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

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

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

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


import os  # 导入os模块,模块的概念后面讲到

print([d for d in os.listdir('.')])  # os.listdir可以列出文件和目录

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

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


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

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

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


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

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

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


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

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

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


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

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

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


x = 'abc'
y = 123
print(isinstance(x, str))

print(isinstance(y, str))

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

三、练习和思考

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


# -*- coding: utf-8 -*-
L1 = ['Hello', 'World', 18, 'Apple', None]
L2=???

# 期待输出: ['hello', 'world', 'apple']
print(L2)

练习参考代码 :

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

运行结果:

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

注:

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

四、总结

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

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

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

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

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

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

往期精彩文章推荐:

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

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
1年前
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:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Stella981 Stella981
11个月前
List的Select 和Select().tolist()
List<Person> delp = new List<Person> { new Person{ Id=1,Name="小明1",Age=11,Sign=0 }, new Person{ Id=2,Name="小明2",Age=12 ,
Easter79 Easter79
11个月前
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
Stella981 Stella981
11个月前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Stella981 Stella981
11个月前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有`time`,和`datetime`两个,本文先说`time`模块。 ### 关于时间戳的几个概念 * 时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。 * 时间元组(`struct_time`),包含9个元素。  `time.struct_time(tm_y
Easter79 Easter79
11个月前
Twitter的分布式自增ID算法snowflake (Java版)
概述 == 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
11个月前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
11个月前
Django中Admin中的一些参数配置
### **设置在列表中显示的字段,id为django模型默认的主键** list_display = ('id', 'name', 'sex', 'profession', 'email', 'qq', 'phone', 'status', 'create_time') ### **设置在列表可编辑字段** list_editable
Wesley13 Wesley13
11个月前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
2个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为