Python 炫技操作:推导式的五种写法

Python 炫技操作:推导式的五种写法_第1张图片

作者:写代码的明哥

来源: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

你可能感兴趣的:(Python 炫技操作:推导式的五种写法)