Рассмотрим следующий интерактивный пример
>>> 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, если кто-то уже сделал это.
пс.
Как вы думаете, контейнеры - это больше дзен, чем итераторы, поскольку для итератора что-то вроде
for i in iterator:
do something
неявно очищает итератор, в то время как контейнер вам явно нужен для удаления элементов.