如何找到itertools.izip_longest的长度

时间:2014-10-02 16:56:00

标签: python

我在'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中包含的长度(元组数)

谢谢

2 个答案:

答案 0 :(得分:2)

izip_longest返回generator,其中返回的每个项目都是动态生成的。如果你想知道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

答案 1 :(得分:1)

技术上你不能,因为它是一个发电机。在调用元素时,它是在运行中生成的。这允许使事物更动态,并且在某些情况下使用更少的内存。在压缩的情况下,您不会生成列表的副本,但生成器会动态生成元组。

但是,您可以使用它来实例化len之类的内容:

pixels = list(pixels)

这样做是消耗生成器并使用相同名称创建列表。 (在生成列表生成器之后会被消耗,所以没有必要留下它。)请记住它是一个稍微不同的对象,它并不总是适合性能。通常可以在压缩之前计算和存储元素的数量,而无需创建其他对象。

顺便说一下你为什么不迭代你需要的像素呢?

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

现在你正在进行2148次迭代,保证什么都不做。