Список точно в срок - PullRequest
3 голосов
/ 25 мая 2010

Я хотел бы знать, есть ли класс, доступный, либо в стандартной библиотеке, либо в Pypi, который соответствует этому описанию.

Конструктор будет использовать итератор.

Он будет реализовывать протокол контейнера (т. Е. __Getitem__, __len__ и т. Д.), Чтобы срезы, длина и т. Д. Работали. При этом он будет повторять и сохранять достаточно значений из аргумента конструктора, чтобы предоставить любую запрашиваемую информацию.

Таким образом, если запрошен jitlist [6], он вызовет self.source.next () 7 раз, сохранит эти элементы в своем списке и вернет последний.

Это позволило бы нижестоящему коду использовать его в качестве списка, но избежать ненужного создания экземпляра списка для случаев, когда функциональность списка не нужна, и избежать выделения памяти для всего списка, если запрошено только несколько элементов. *

Это кажется довольно простым для написания, но это также кажется достаточно полезным, так что вполне вероятно, что кто-то уже сделал его доступным в модуле.

1 Ответ

2 голосов
/ 25 мая 2010
import itertools
class Indexable(object):
    def __init__(self,it):
        self.it=it
        self.already_computed=[]
    def __iter__(self):
        for elt in self.it:
            self.already_computed.append(elt)
            yield elt
    def __getitem__(self,index):
        try:
            max_idx=index.stop
        except AttributeError:
            max_idx=index
        n=max_idx-len(self.already_computed)+1
        if n>0:
            self.already_computed.extend(itertools.islice(self.it,n))
        return self.already_computed[index]      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...