2014-10-02 21 views
3

我已存儲內的「itertools.izip_longest」如何找到itertools.izip_longest的長度

我試圖通過包含withinthe itertools.izip_longest改變一些值,這些元組循環元組的許多中所示的代碼下面

for i in range(len(pixels)): 
    if i >= 2148 and i <= 3505: 
    if pixels[i][0] == 146: # assuming each data element is a 3 element tuple 
    pixels[i][0] += 1 

然而,當我嘗試運行的代碼,我得到關於長度的錯誤:

for i in range(len(pixels)): 
TypeError: object of type 'itertools.izip_longest' has no len() 

我怎麼能找到的長度(數元組)續在itertools.izip_longest

感謝

+0

它可以無限長... – moooeeeep 2014-10-02 17:00:24

回答

1

從技術上講,你不能,因爲它是發電機。在呼叫一個元素時,它會立即生成。這可以使事情更具動態性,並在某些情況下使用更少的內存。在壓縮的情況下,您不會生成列表的副本,但生成器會即時生成元組。

但是,你可以用它來insantiate東西,有len像列表:

pixels = list(pixels) 

這樣做是它消耗的發電機,使在相同的名稱的列表。 (生成列表生成器後會消耗掉,所以沒有必要留下它。)請記住它是一個稍微不同的對象,它並不總是適合性能方面的。通常可以在壓縮之前計算和存儲元素的數量,而無需創建其他對象。

順便說一句,爲什麼你不只是迭代你需要的像素?

pixels = list(pixels) 
for pixel in pixels[2148:3505]: 
    if pixel[0] == 146: 
    pixel[0] += 1 

現在你正在做2148次迭代,保證什麼都不做。

+0

謝謝,這似乎是一個更好的解決方案,它的想法是添加1到146的像素值,使其146,但是,當運行我得到錯誤TypeError:'itertools.izip_longest 'object has no attribute'__getitem__' – Rich 2014-10-02 17:19:40

+0

這是因爲相同的原因。元素不存在於生成器中,因此不能隨機獲得第2148個元素。 'pixel'被假定爲一個列表。我編輯了答案,以便包含該行。 – luk32 2014-10-02 17:21:59

2

izip_longest返回generator,其中在飛行中產生返回的每個項目內ained。如果你想知道有多少項目在迭代,你可以做

len(list(pixels)) 

這是一樣的

len([item for item in pixels]) 

例子:

In [1]: from itertools import izip_longest 

In [2]: x = izip_longest(range(10), range(100)) 

In [3]: len(x) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-3-e62f33f06233> in <module>() 
----> 1 len(x) 

TypeError: object of type 'itertools.izip_longest' has no len() 

In [4]: len(list(x)) 
Out[4]: 100