Python 准时制列表
我想知道在标准库或pypi中是否有一个类符合这种描述 构造函数将采用迭代器 它将实现容器协议(即uuu getitem uuuuuu、uuuuu len uuuuuuuu等),以便切片、长度等可以工作。这样,它将迭代并从构造函数参数中保留足够的值,以提供所请求的任何信息 因此,如果请求jitlist[6],它将调用self.source.next()7次,将这些元素保存在其列表中,并返回最后一个元素 这将允许下游代码将其用作列表,但避免在不需要列表功能的情况下不必要地实例化列表,并避免在仅请求少数成员时为整个列表分配内存Python 准时制列表,python,list,iterator,Python,List,Iterator,我想知道在标准库或pypi中是否有一个类符合这种描述 构造函数将采用迭代器 它将实现容器协议(即uuu getitem uuuuuu、uuuuu len uuuuuuuu等),以便切片、长度等可以工作。这样,它将迭代并从构造函数参数中保留足够的值,以提供所请求的任何信息 因此,如果请求jitlist[6],它将调用self.source.next()7次,将这些元素保存在其列表中,并返回最后一个元素 这将允许下游代码将其用作列表,但避免在不需要列表功能的情况下不必要地实例化列表,并避免在仅请求少
写起来似乎很容易,但是它似乎也很有用,很可能有人已经在模块中提供了它。如果不先迭代源代码,它将如何实现
\uuuuuu len\uuuuu
,它将迭代源代码以响应\uuuu len\uuu
列表。extend
将任意iterable作为其参数,因此,您可以将.extend(list(itertools.islice(self.it,n)))
写成.extend(itertools.islice(self.it,n))
@Mike Graham:谢谢您的改进
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]