[英]How to find the length of itertools.izip_longest
我有很多元組存儲在'itertools.izip_longest'中
我試圖循環遍歷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中包含的長度(元組數)
謝謝
izip_longest
返回一個生成器 ,其中返回的每個項目都是動態生成的。 如果你想知道iterable中有多少項,你可以這樣做
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
從技術上講,你不能,因為它是一個發電機。 在調用元素時,它是在運行中生成的。 這允許使事物更動態,並且在某些情況下使用更少的內存。 在壓縮的情況下,您不會生成列表的副本,但生成器會動態生成元組。
但是,您可以使用它來實例化像列表一樣的len
:
pixels = list(pixels)
這樣做是消耗生成器並使用相同的名稱生成列表。 (在生成列表生成器之后會被消耗,所以沒有必要留下它。)請記住它是一個稍微不同的對象,它並不總是適合性能。 通常可以在壓縮之前計算和存儲元素的數量而不創建其他對象。
順便問一下你為什么不迭代你需要的像素?
pixels = list(pixels)
for pixel in pixels[2148:3505]:
if pixel[0] == 146:
pixel[0] += 1
現在你正在進行2148次迭代,保證什么都不做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.