1.1.9列表推导式
列表推导式使用非常简介的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。
有三种等价方法:
>>> aList=[x*x for x in range(10)]
>>> aList
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>
>>> aList=[]
>>> aList
[]
>>> for x in range(10):
... aList.append(x*x)
...
>>> aList
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>
>>> aList=list(map(lambda x:x*x,range(10)))
>>> aList
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> aList=[2**x for x in range(64)]
>>> aList
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
>>> sum(aList)
18446744073709551615
使用列表推导式实现嵌套列表的平铺:
>>> vec=[[1,2,3],[4,5,6],[7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
num:每个数字;elem:小列表;vec:大列表
相当于:
>>> vec=[[1,2],[3,4],[5,6],[7,8]]
>>> result = []
>>> for elem in vec:
... for num in elem:
... result.append(num)
...
>>> result
[1, 2, 3, 4, 5, 6, 7, 8]
如果不使用列表推导式,也可以这样:
>>> vec = [[1,2,3],[4,5,6],[7,8,9]]
>>> sum(vec,[])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> vec
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> from itertools import chain
>>> list(chain(*vec))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
*序列解包
列出当前文件夹下所有Python源文件
>>> import os
>>> [filename for filename in os.listdir('.')if filename.endswith(('.py','.pyw'))]
[]
过滤不符合条件的元素:
>>> aList=[-1,-4,6,7.5,-2.3,-9,-11]
>>> [num for num in aList if num>0]
[6, 7.5]
已知有一个包含一些同学成绩的字典,计算成绩的最高分,最低分,平均分,并查找所有最高分同学。
>>> scores={"zhang san":45,"li si":78,"wang wu":40,"zhou lin":96,"zhao qi":65,"sun ba":90,"zheng jiu":78,"wu shi":99,"dong shiyi":60}
>>> highest=max(scores.values())
>>> lowest=min(scores.values())
>>> average=sum(scores.values())*1.0/len(scores)
>>> highest,lowest,average
(99, 40, 72.33333333333333)
>>> highestPerson=[name for name,values in scores.items() if values==highest]
>>> lowestPerson=[name for name,values in scores.items() if values==lowest]
>>> highestPerson,lowestPerson
(['wu shi'], ['wang wu'])
在列表推导式中使用多个循环,实现多序列元素的任意组合,并且可以结合条件语句过滤特定元素
>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
>>> [(x,y) for x in range(1,4) for y in [3,1,4]]
[(1, 3), (1, 1), (1, 4), (2, 3), (2, 1), (2, 4), (3, 3), (3, 1), (3, 4)]
使用列表推导式实现矩阵转置:
>>> matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> [[row[i] for row in matrix]for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
也可以使用内置函数来实现矩阵转置
>>> list(zip(*matrix)) #zip拉链函数,*序列解包,把最外面的括号去 掉
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
列表推导式中可以使用函数或复杂表达式
>>> def f(v):
... if v%2 == 0:
... v=v**2
... else:
... v=v+1
... return