python列表解析式是個很神奇的東西!
在列表中運用了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)]]
總的來說,如果只有乙個列表解析式的話,從左往右計算迴圈。
如果列表解析式中還有列表解析式中的話,先算外面的(從左到右計算),再算裡面的,裡面算完,退出來再算。
【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粘合成乙個字串並加上換行符!
Python列表解析式
有時候,乙個程式設計設計模式使用得十分普遍,甚至會逐步形成自己獨特的語法。python程式語言中的列表解析式 list comprehension 就是這類語法糖 syntactic sugar 的絕佳代表。python中的 列表解析式 是個偉大的發明,但是要掌握好這個語法則有些難,因為它們並是用來...
python 列表解析式
python的列表解析式只是為了解決已有問題提供新的語法 什麼是列表解析式?列表解析式是將乙個列表轉換成另乙個列表的工具。在轉換過程中,可以指定元素必須符合一定的條件,才能新增至新的列表中,這樣每個元素都可以按需要進行轉換。可以把列表解析式看作為結合了filter函式與map函式功能的語法糖 dou...
Python列表解析(列表推導式)
列表解析 用來動態地建立列表 expr for iter var in iterable if cond expr 例子一 map lambda x x 2,range 6 0,1,4,9,16,25 x 2 for x in range 6 0,1,4,9,16,25 列表解析式可以取代內建的ma...