我在'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中包含的长度(元组数)
谢谢
答案 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次迭代,保证什么都不做。