gpt4 book ai didi

python - 在 Python 中对生成器进行索引和切片

转载 作者:IT老高 更新时间:2023-10-28 22:12:22 25 4
gpt4 key购买 nike

假设我有一个如下所示的生成器函数:

def fib():
x,y = 1,1
while True:
x, y = y, x+y
yield x

理想情况下,我可以只使用 fib()[10]fib()[2:12:2] 来获取索引和切片,但目前我有为这些事情使用 itertools。我不能使用生成器来替换列表。

我相信解决方案是将 fib() 包装在一个类中:

class Indexable(object):
....

fib_seq = Indexable(fib())

Indexable 应该是什么样子才能完成这项工作?

最佳答案

import itertools

class Indexable(object):
def __init__(self,it):
self.it = iter(it)
def __iter__(self):
return self.it
def __getitem__(self,index):
try:
return next(itertools.islice(self.it,index,index+1))
except TypeError:
return list(itertools.islice(self.it,index.start,index.stop,index.step))

你可以这样使用它:

it = Indexable(fib())
print(it[10])
#144
print(it[2:12:2])
#[610, 1597, 4181, 10946, 28657]

注意 it[2:12:2] 不返回 [3, 8, 21, 55, 144] 因为迭代器已经推进了 11 个元素,因为it[10] 的调用。

编辑:如果您希望 it[2:12:2] 返回 [3, 8, 21, 55, 144] 然后也许使用它来代替:

class Indexable(object):

def __init__(self, it):
self.it = iter(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]

此版本将结果保存在 self.already_computed 并使用这些结果如果可能的话。否则,它会计算更多的结果,直到它有足够多的结果返回索引元素或切片。

关于python - 在 Python 中对生成器进行索引和切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2322642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com