您的位置:首页 > 编程语言 > Python开发

Python学习笔记:列表解析式

2016-05-22 21:55 393 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Python列表解析式是个很神奇的东西!</span>


在列表中运用了for循环,或者for循环加上if 等条件判断语句,能够很明显的简化代码量。

1.单个for循环

>>> a = [i for i in range(1,4)]
>>> a
[1, 2, 3]


2.两个for循环

>>> a = [(x,y) for x in range(1,4) for y in range(1,4)]
>>> a
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]


for循环,从左到右执行,先得到x为1,然后进行三次y的循环,就如for循环的嵌套一样。

然后将每次得到的x和y的值,放进一个元组中,最后所有的元组组成列表。

三个for循环也是如此

>>> a = [(x,y,z) for x in range(1,3) for y in range(1,3) for z in range(1,3)]
>>> a
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]


3.for循环和if条件语句

>>> a = [i for i in range(1,10) if i%3==0]	#用if语句控制筛选出能够整除3的数字
>>> a
[3, 6, 9]


当然也可以用or and 之类的条件语句。

>>> a = [i for i in range(1,10) if i%3==0 or i%2==0]	#筛选出能够整除3或者整除2的数字
>>> a
[2, 3, 4, 6, 8, 9]


4.列表解析式中再运用列表解析式!

>>> a = [[(x,y) for y in range(1,3)]for x in range(1,3)]
>>> a
[[(1, 1), (1, 2)], [(2, 1), (2, 2)]]


这里先得到最外面的列表的x的值后,然后进入里面的列表中运算,得到x和y放到一个元组中,最后里面的列表全部运算完成后,把得到的所有的元组放到一个列表中,再到外面的列表中运算得到x的值,再次进入里面的列表,依此论推。

>>> a = [[[(x,y,z)for z in range(1,3)]for y in range(1,3)]for x in range(1,3)]
>>> a
[[[(1, 1, 1), (1, 1, 2)], [(1, 2, 1), (1, 2, 2)]], [[(2, 1, 1), (2, 1, 2)], [(2, 2, 1), (2, 2, 2)]]]


三个列表也是一样的。

如果外面的列表中有两个for循环的话从左往右计算,先算外面的第一个循环得到一个x的值,再算外面的第二个循环得到y的值,再进入里面的列表计算,里面的循环全部计算完成后,退到外面的列表算第二个循环得到下一个值,再进入里面的循环,依此论推,直到全部的循环算完。

>>> a = [[(x,y,z)for z in range(1,3)]for x in range(1,3) for y in range(1,3)]
>>> a
[[(1, 1, 1), (1, 1, 2)], [(1, 2, 1), (1, 2, 2)], [(2, 1, 1), (2, 1, 2)], [(2, 2, 1), (2, 2, 2)]]


总的来说,如果只有一个列表解析式的话,从左往右计算循环。

如果列表解析式中还有列表解析式中的话,先算外面的(从左到右计算),再算里面的,里面算完,退出来再算。

【【1】2 3】 如果1、2、3代表三个循环的话,先计算循环2得到一个值,然后计算循环3得到一个值,再算循环1,循环1全部循环完成后,再退出来算循环2得到下一个值,再次进入循环1,直到循环2全部循环完成后,退到循环1得到下一个值,再算循环2,然后循环1,,依此论推。

列子:一行代码写出九九乘法表!!!

print('\n'.join([''.join(['%s*%s=%-3s' % (x,y,y*x) for x in range(1,y+1)]) for y in range(1,10)]))


输出:

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

1*4=4 2*4=8 3*4=12 4*4=16

1*5=5 2*5=10 3*5=15 4*5=20 5*5=25

1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49

1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64

1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

先算外面的列表得到y=1,然后进入里面的列表,range(1,1)x循环一次,得到1*1=1放到一个列表中,然后退到外面y=2,里面range(1,3) x循环两次,得到1*2=2 2*2=4 并用join粘合成一个字符串,放到一个列表中,这依此论推,最后全部算完后,用join粘合成一个字符串并加上换行符!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: