参考: Python3 数据结构 | 菜鸟教程 

列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

这里我们将列表中每个数值乘三,获得一个新的列表:

>>> vec = [ 2 , 4 , 6 ]
>>> [ 3*x for x in vec ]
[ 6 , 12 , 18 ]

现在我们玩一点小花样:

>>> [ [x , x** 2 ] for x in vec ]
[ [ 2 , 4 ] , [ 4 , 16 ] , [ 6 , 36 ] ]

这里我们对序列里每一个元素逐个调用某方法:

实例

>>> freshfruit = [ '  banana' , '  loganberry ' , 'passion fruit  ' ]
>>> [weapon. strip ( ) for weapon in freshfruit ]
[ 'banana' , 'loganberry' , 'passion fruit' ]

我们可以用 if 子句作为过滤器:

>>> [ 3*x for x in vec if x > 3 ]
[ 12 , 18 ]
>>> [ 3*x for x in vec if x < 2 ]
[ ]

以下是一些关于循环和其它技巧的演示:

>>> vec1 = [ 2 , 4 , 6 ]
>>> vec2 = [ 4 , 3 , - 9 ]
>>> [x*y for x in vec1 for y in vec2 ]
[ 8 , 6 , - 18 , 16 , 12 , - 36 , 24 , 18 , - 54 ]
>>> [x+y for x in vec1 for y in vec2 ]
[ 6 , 5 , - 7 , 8 , 7 , - 5 , 10 , 9 , - 3 ]
>>> [vec1 [i ]*vec2 [i ] for i in range ( len (vec1 ) ) ]
[ 8 , 12 , - 54 ]

列表推导式可以使用复杂表达式或嵌套函数:

>>> [ str ( round ( 355/ 113 , i ) ) for i in range ( 1 , 6 ) ]
[ '3.1' , '3.14' , '3.142' , '3.1416' , '3.14159' ]

嵌套列表解析

Python的列表还可以嵌套。

以下实例展示了3X4的矩阵列表:

>>> matrix = [
...     [ 1 , 2 , 3 , 4 ] ,
...     [ 5 , 6 , 7 , 8 ] ,
...     [ 9 , 10 , 11 , 12 ] ,
... ]

以下实例将3X4的矩阵列表转换为4X3列表:

>>> [ [row [i ] for row in matrix ] for i in range ( 4 ) ]
[ [ 1 , 5 , 9 ] , [ 2 , 6 , 10 ] , [ 3 , 7 , 11 ] , [ 4 , 8 , 12 ] ]

以下实例也可以使用以下方法来实现:

>>> transposed = [ ]
>>> for i in range ( 4 ):
...     transposed. append ( [row [i ] for row in matrix ] )
...
>>> transposed
[ [ 1 , 5 , 9 ] , [ 2 , 6 , 10 ] , [ 3 , 7 , 11 ] , [ 4 , 8 , 12 ] ]

另外一种实现方法:

>>> transposed = [ ]
>>> for i in range ( 4 ):
...     # the following 3 lines implement the nested listcomp
...     transposed_row = [ ]
...     for row in matrix:
...         transposed_row. append (row [i ] )
...     transposed. append (transposed_row )
...
>>> transposed
[ [ 1 , 5 , 9 ] , [ 2 , 6 , 10 ] , [ 3 , 7 , 11 ] , [ 4 , 8 , 12 ]

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄