[Python] izip, cycle使用
覺得這實在很好用, 把他記錄下來一下
python再itertools裡面有兩個很方便的東西, 一個是izip, 另外一個是cycle
首先izip, 他可以將多個list垂直合併起來使用, 這邊熟悉python的人會覺的不是也有一個zip可以使用嗎?
其實這兩個做的結果一樣, 但是過程有點差異
ex:
上述程式碼就會(1, 5), (5, 10), (10 ,15)的印出來
那下列這行結果也是一樣
所以以結果來看看不出來差異, 但是在實作上, izip是當存取到那個item, 他才會去合併相對的list item
使用時機是, 假如list已經不小了, 合併會變成超大list, 那可能會造成記憶體吃太多, 而導致out of memory
而其實你只是要存取幾個合併的時候才要的item, 並不用真的完全合併所有list, 那就用izip就好, 可以剩下一些速度跟空間
再來是cycle, 這個東西比較不直觀, 首先使用方式是cycle(iterable), 也就是要傳一個iterable的物件進去
ex:
你會發現他停不下來, 拼命印, 一直不停的印出5, 10, 15, 5, 10, 15, 5, 10, 15...etc不停重複
原因很簡單, cycle就是會幫你做出一連串重複的結果
所以通常cycle要配合其他東西使用, 下面兩個for-loop舉例
ex:
這結果就會是
很明顯, 如果沒有用cycle, 就算我用zip合併list, 也只會印出最小的list的範圍, 如果我用cycle, 他會自動把有用cycle的list延長到跟最長的長度一樣, 而且不停的重複5, 10, 15, 5, 10, 15
python再itertools裡面有兩個很方便的東西, 一個是izip, 另外一個是cycle
首先izip, 他可以將多個list垂直合併起來使用, 這邊熟悉python的人會覺的不是也有一個zip可以使用嗎?
其實這兩個做的結果一樣, 但是過程有點差異
ex:
from itertools import izip xl = [1, 5, 10] yl = [5, 10, 15] for x, y in izip(xl, yl): print x, y
上述程式碼就會(1, 5), (5, 10), (10 ,15)的印出來
那下列這行結果也是一樣
for x, y in zip(xl, yl): print x, y
所以以結果來看看不出來差異, 但是在實作上, izip是當存取到那個item, 他才會去合併相對的list item
使用時機是, 假如list已經不小了, 合併會變成超大list, 那可能會造成記憶體吃太多, 而導致out of memory
而其實你只是要存取幾個合併的時候才要的item, 並不用真的完全合併所有list, 那就用izip就好, 可以剩下一些速度跟空間
再來是cycle, 這個東西比較不直觀, 首先使用方式是cycle(iterable), 也就是要傳一個iterable的物件進去
ex:
from itertools import cycle yl = [5, 10, 15] for item in cycle(yl):
print item
你會發現他停不下來, 拼命印, 一直不停的印出5, 10, 15, 5, 10, 15, 5, 10, 15...etc不停重複
原因很簡單, cycle就是會幫你做出一連串重複的結果
所以通常cycle要配合其他東西使用, 下面兩個for-loop舉例
ex:
from itertools import izip, cycle xl = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] yl = [5, 10, 15] print "The following is Without cycle" for a, b in izip(xl, yl): print a, b print "The following is With cycle" for a, b in izip(xl, cycle(yl)): print a, b
這結果就會是
The following is Without cycle 1 5 2 10 3 15 The following is With cycle 1 5 2 10 3 15 4 5 5 10 6 15 7 5 8 10 9 15 10 5 11 10 12 15 13 5 14 10 15 15 16 5 17 10 18 15 19 5 20 10
很明顯, 如果沒有用cycle, 就算我用zip合併list, 也只會印出最小的list的範圍, 如果我用cycle, 他會自動把有用cycle的list延長到跟最長的長度一樣, 而且不停的重複5, 10, 15, 5, 10, 15
網誌管理員已經移除這則留言。
回覆刪除