作者:写代码的明哥
来源:Python编程时光
推导式(英文名:comprehensions),也叫解析式,是Python的一种独有特性。
推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
总共有四种推导式:
列表(list)推导式
字典(dict)推导式
集合(set)推导式
生成器推导式
1. 列表推导式
列表推导式的基本格式
new_list = [expression for_loop_expressionifcondition]
举个例子。
我想找出一个数值列表中为偶数的元素,并组成新列表,通常不用列表推导式,可以这么写
old_list = [0,1,2,3,4,5]
new_list = []
foriteminold_list:
ifitem %2==0:
new_list.append(item)
print(new_list)# output: [0, 2, 4]
一个简单的功能,写的代码倒是不少。
如果使用了列表推导式,那就简洁多了,而且代码还变得更加易读了。
>>> old_list = [0,1,2,3,4,5]
>>>
>>> new_list = [itemforiteminold_listifitem %2==0]
>>> print(new_list)# output: [0, 2, 4]
[0,2,4]
2. 字典推导式
列表推导式的基本格式,和 列表推导式相似,只是把 [] 改成了 {},并且组成元素有两个:key 和 value,要用 key_expr: value_expr 表示。
new_dict ={ key_expr: value_expr for_loop_expressionifcondition }
举个例子。
我想从一个包含所有学生成绩信息的字典中,找出数学考满分的同学。
old_student_score_info = {
"Jack": {
"chinese":87,
"math":92,
"english":78
},
"Tom": {
"chinese":92,
"math":100,
"english":89
}
}
new_student_score_info = {name: scoresforname, scoresinold_student_score_info.items()ifscores["math"] ==100}
print(new_student_score_info)
# output: {'Tom': {'chinese': 92, 'math': 100, 'english': 89}}
3. 集合推导式
集合推导式跟列表推导式也是类似的。唯一的区别在于它使用大括号{},组成元素也只要一个。
基本格式
new_set = { expr for_loop_expressionifcondition }
举个例子
我想把一个数值列表里的数进行去重处理
>>> old_list = [0,0,0,1,2,3]
>>>
>>> new_set = {itemforiteminold_list}
>>> print(new_set)
{0,1,2,3}
4. 生成器推导式
生成器推导式跟列表推导式,非常的像,只是把 [] 换成了 ()
列表推导式:生成的是新的列表
生成器推导式:生成的是一个生成器
直接上案例了,找出一个数值列表中所有的偶数
>>> old_list = [0,1,2,3,4,5]
>>> new_list = (itemforiteminold_listifitem %2==0)
>>> new_list
at0x10292df10>
>>> next(new_list)
0
>>> next(new_list)
2
5. 嵌套推导式
for 循环可以有两层,甚至更多层,同样的,上面所有的推导式,其实都可以写成嵌套的多层推导式。
但建议最多嵌套两层,最多的话,代码就会变得非常难以理解。
举个例子。
我想打印一个乘法表,使用两个for可以这样写
foriinrange(1,10):
forjinrange(1, i+1):
print('{}x{}={}\t'.format(j, i, i*j), end='')
print("")
输出如下
1x1=1
1x2=22x2=4
1x3=32x3=63x3=9
1x4=42x4=83x4=124x4=16
1x5=52x5=103x5=154x5=205x5=25
1x6=62x6=123x6=184x6=245x6=306x6=36
1x7=72x7=143x7=214x7=285x7=356x7=427x7=49
1x8=82x8=163x8=244x8=325x8=406x8=487x8=568x8=64
1x9=92x9=183x9=274x9=365x9=456x9=547x9=638x9=729x9=81
如果使用嵌套的列表推导式,可以这么写
>>> print('\n'.join([' '.join(['%2d *%2d = %2d'% (col, row, col * row)forcolinrange(1, row +1)])forrowinrange(1,10)]))
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81