aList =[x * x for x inrange(10)]==>#使用内置函数
aList =[]for x inrange(10):
aList.append(x * x )==>#函数式编程
aList =list(map(lambda x:x * x,range(10)))
#一共64个小格子,在第一个格子里放1粒米,第二个格子里放2粒米,第三个格子里放4粒米,第四个格子里放8粒米,以此类推,后面每个格子里的米都是前一个格子里的2倍,一直把64个格子都放满。需要多少粒米呢?>>>sum([2** i for i inrange(64)])18446744073709551615>>>sum(2** i for i inrange(64))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]>>> result =[]>>>for elem in vec:for num in elem:
result.append(num)>>> result
[1,2,3,4,5,6,7,8,9]
不使用列表推导式
#方法一>>>sum(vec,[])[1,2,3,4,5,6,7,8,9]#sum用法>>>help(sum)
Help on built-in function sumin module builtins:sum(iterable, start=0,/)
Return the sum of a 'start' value (default:0) plus an iterable of numbers When the iterable is empty,return the start value.#方法二>>>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.endwith(('.py','.pyw'))]
过滤不符合条件的元素
>>> aList =[-1,-4,6,7.5,-2.3,9,-11]>>>[i for i in aList if i>0][6,7.5,9]
#已知有一个包含一些同学成绩的字典,计算成绩的最高分、最低分、平均分,并查找所有最高分同学>>> scores ={"zhangsan":45,"lisu":78,"Wang Wu":40,"Zhou Liu":96,"zhao Qi":65,"su ba":90,"zheng ju":78,"wu shi":99,"dong shiyi":60}>>> higest =max(scores.values())>>> lowest =min(scores.values())>>> average =sum(scores.values())*1.0/len(scores)>>> higest,lowest,average
(99,40,72.33333333333333)>>> highestPerson =[name for name,score in scores.items()if score == higest]>>> highestPerson
['wu shi']
在列表推导式中使用多个循环,实现多序列元素的任意组合,并可以结合条件语句过滤特定元素
>>>[(x,y)for x inrange(3)for y inrange(3)][(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]>>>[(x,y)for x in[1,2,3]for y in(2,3,4)if x != y][(1,2),(1,3),(1,4),(2,3),(2,4),(3,2),(3,4)]
使用列表推导式实现矩阵转置
>>> matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]]>>>[[row[i]for row in matrix]for i inrange(4)][[1,5,9],[2,6,10],[3,7,11],[4,8,12]]#使用列表推导式实现矩阵转置>>>list(zip(*matrix))#序列解包[(1,5,9),(2,6,10),(3,7,11),(4,8,12)]
列表推导式可以使用函数或复杂表达式
>>>deff(v):if v %2==0:
v = v **2else:
v = v +1return v
>>>[f(v)for v in[2,3,4,-1]if v >0][4,4,16]#使用复杂表达式>>>[v **2if v %2==0else v +1for v in[2,3,4,-1]if v >0][4,4,16]
列表推导式支持文件对象迭代
withopen('c:\\RHDSetup.log','r')as fp:print([line for line in fp])
#使用列表推导式生成100以内的所有素数>>>[p for p inrange(2,100)if0notin[p % d for d inrange(2,int(p **0.5)+1)]][2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
2.1.10 使用列表实现向量运算
>>>import random
>>> x =[random.randint(1,100)for i inrange(10)]#生成随机数>>> y =[random.randint(1,100)for i inrange(10)]>>>list(map(lambda i: i +5,x))#所有元素同时加5[46,70,65,68,34,64,105,9,11,103]>>> x =[random.randint(1,10)for i inrange(10)]>>> y =[random.randint(1,10)for i inrange(10)]>>>import operator
>>>sum(map(operator.mul,x,y))357>>>sum((i * j for i,j inzip(x,y)))357>>>list(map(operator.add,x,y))[10,14,10,16,7,20,11,7,11,13]