老听到课程里讲,列表推导式。总也不明白,什么是列表推导式。
今天查了一些资料。记录一下学习成果。
首先看看比较官方的说法:
什么是推导式?
推导式 comprehensions(又称解析式),是 python 的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列。
抽象吧,看不懂吧。我刚开始看的时候也这样。
用例子说明吧。
比如下面这一道题:需要得出一个列表,这个列表里,存0-8每个数字的平方。
先别往下看,自己想一下怎么写。
第一种写法:(常规)
list1 = []
for i in range(9):
list1.append(i*i)
print(list1)
第二种写法:(推导式)
list1 = [x*x for x in range(9)]
print(list1)
两种写法最后的结果都是
[0, 1, 4, 9, 16, 25, 36, 49, 64]
第二种写法就是推导式。因为我们是推导list列表的,所以又叫列表推导式
列推导式的语法是这样的:
变量名 = [表达式 for 变量 in 列表]
这里多说一点:
1、表达式,不止上边的乘法*
2、变量 ,也不止上边的一个变量
上面的例子只用了一个数的乘法。
那两个数的乘法呢?如下
list2 = [x * y for x in range(1,10) for y in range(1,10)]
那两个数的加法呢?也可以,如下
list3 = [x + y for x in range(1,10) for y in range(1,10)]
那能不能加if判断条件?也可以,如下
list4 = [x for x in range(1,10) if x % 2 == 0]
跟列表推导式一样,就是返回值是字典。
变量名 = {key: value表达式}
比如:
dic = {x:x/2 for x in range(1,10)}
# 运行结果:{1: 0.5, 2: 1.0, 3: 1.5, 4: 2.0, 5: 2.5, 6: 3.0, 7: 3.5, 8: 4.0, 9: 4.5}
多说一个知识点,举例说明:
如下代码,执行结果会是什么?
dic = {'half': x/2 for x in range(1,10) if x % 2 == 0}
估计会有人觉的答案是:
{'half':1.0, 'half':2.0,'half': 3.0, 'half': 4.0}
其实答案是:
{'half': 4.0}
这里有个知识点比较容易忘。就是字典的键值是唯一的,键重复了,后边的会覆盖前边的。
'half’是字典的键,同时又是个字符串,是个固定值。所以最后的{‘half’: 4.0}就吧前边的都给覆盖了
又比如:
根据一个字典生成另一个字典。假设场景:学校考试完成后,把考试成绩生成到了一个字典里。
找出及格的人and不及格的人
# 所有学生的成绩(假设所有人都不重名)
dic_all = {
'张三': 90,
'李四': 78,
'王五': 98,
'马六': 79,
'小明': 92,
'小张': 59,
'小李': 57,
'小王': 50,
'小马': 80,
'小小': 80,
'小小小': 40,
}
# 及格的同学
dic_pass= {key:value for key, value in dic_all.items() if value >= 60}
print('及格的同学有',len(dic_pass),'人',dic_pass)
# 不及格的同学
dic_unpass= {key:value for key, value in dic_all.items() if value < 60}
print('不及格的同学有:',len(dic_unpass),'人',dic_unpass)
跟列表推导式一样,就是返回值是集合。
变量名 = {表达式 for 变量 in 列表 for 变量 in xxx}
例如:
set1 = {x for x in range(10) if x % 2 == 0}
# 运行结果: {0, 2, 4, 6, 8}
根据上边的经验,元组推导式的公式,推测应该是:
变量名 = (表达式 for 变量 in 列表 for 变量 in xxx)
先来看个例子:
tuple1=(x for x in range(1,10))
# 运行结果: at 0x00000237ECF97F20>
问:为什么运行结果是这么个鬼画符?
答:上面的代码返回的变量其实是一个生成器,并不是一个元组。这一点和列表生成器是不同的。有人管这个叫“伪元组推导式”
问:那怎么才能访问里边的元素呢?
答:可以使用tuple()或list()将其转换为元组或列表。
# 转换为元组
tuple1=tuple((x for x in range(1,10)))
# 运行结果:(1, 2, 3, 4, 5, 6, 7, 8, 9)
# 转换为列表
list1 = list((x for x in range(1,10)))
# 运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]
以上
总结:
Python 支持4种数据结构的推导式:
列表(list)推导式
字典(dict)推导式
集合(set)推导式
元组(tuple)推导式
这篇文章里把所有的都实验了。推导式主要是用来简化循环的代码,生成不同的数据结构用的。推导式功能强大,用处广泛,而且可以使代码简洁。
参考:
https://www.runoob.com/python3/python-comprehensions.html