<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粘合成一个字符串并加上换行符!