Itertools для контейнеров

Рассмотрите следующий интерактивный пример

>>> l=imap(str,xrange(1,4))
>>> list(l)
['1', '2', '3']
>>> list(l)
[]

Кто-нибудь знает, существует ли где-то уже реализация с версией imap (и другими функциями itertools), например что второй раз список (l) выполняется, вы получаете то же самое, что и первый. И мне не нужна обычная карта, потому что создание всего вывода в памяти может быть пустой тратой памяти, если вы используете большие диапазоны.

Я хочу что-то, что в основном делает что-то вроде

class cmap:
    def __init__(self, function, *iterators):
        self._function = function
        self._iterators = iterators

    def __iter__(self):
        return itertools.imap(self._function, *self._iterators)

    def __len__(self):
        return min( map(len, self._iterators) )

Но было бы пустой тратой времени делать это вручную для всех itertools, если кто-то уже это сделал.

ps. Считаете ли вы, что контейнеры более дзен, чем итераторы, поскольку для итератора нечто вроде

for i in iterator:
    do something

неявно очищает итератор, в то время как контейнер вам явно необходимо удалить элементы.

9
задан M.D. 14 August 2011 в 11:42
поделиться