簡體   English   中英

如何找到itertools.izip_longest的長度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM