2014-10-02 4 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() 

как я могу найти длину (число кортежей) продолжение ained в пределах itertools.izip_longest

благодаря

+0

Это может быть бесконечно долго ... – moooeeeep

ответ

1

Технически вы не можете, потому что это генератор. После вызова элемента он генерируется «на лету». Это позволяет сделать вещи более динамичными и в некоторых случаях использовать меньше памяти. В случае zipping вы не создаете копию списков, но генератор генерирует кортежи «на лету».

Однако, вы можете использовать его для insantiate то, что имеет len как список:

pixels = list(pixels) 

Что это делает он потребляет генератор и составляет список под тем же именем. (После генерации генератора списка будет потребляться, поэтому нет смысла оставлять его вокруг.) Пожалуйста, помните, что это немного другой объект, и это не всегда подходящая производительность. Обычно можно вычислить и сохранить количество элементов перед тем, как сделать zipping, не создавая дополнительных объектов.

Btw Почему бы вам просто не перебирать пиксели, которые вам нужны?

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 'объект не имеет атрибута' __getitem__ ' – Rich

+0

Это по той же причине. Элементы не существуют в генераторе, поэтому вы не можете случайно получить 2148-й. 'pixel' считается уже списком. Я отредактировал ответ так, чтобы он включал строку. – luk32

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 
Смежные вопросы