python - 自动扩展的动态列表

标签 python pop-11

如何从 Pop-11 中创建一个与 pdtolist 等效的 Python?

假设我有一个名为 g 的生成器,它一次返回(比方说)一个整数。我想构建一个列表 a ,当我请求超出列表当前末尾的值时它会自动增长。例如:

print a # => [ 0, 1, 2, g]
print a[0] # => 0
print a[1] # => 1
print a[2] # => 2
# (obvious enough up to here)

print a[6] # => 6
print a # => [ 0, 1, 2, 3, 4, 5, 6, g]
# list has automatically expanded

a = a[4:] # discard some previous values
print a # => [ 4, 5, 6, g]
print a[0] # => 4

术语 - 预料到可能的误解:列表是“动态数组”,但我不是这个意思;我想要一个更抽象意义上的“动态列表”。

为了更好地解释动机,假设您有 999999999 个项目要处理。试图一次将所有这些都放入内存(在普通列表中)将是一个挑战。生成器通过一次呈现一个来解决这部分问题;每个都按需创建或从磁盘单独读取。但是假设在处理过程中你想引用一些最近的值,而不仅仅是当前值?您可以记住单独列表中的最后(比如)十个值。但动态列表更好,因为它会自动记住它们。

最佳答案

这可能会让你开始:

class DynamicList(list):
    def __init__(self, gen):
        self._gen = gen

    def __getitem__(self, index):
        while index >= len(self):
            self.append(next(self._gen))
        return super(DynamicList, self).__getitem__(index)

您需要为切片添加一些特殊处理(目前,它们只返回一个普通列表,因此您失去了动态行为)。此外,如果您希望生成器本身是一个列表项,那会增加一些复杂性。

关于python - 自动扩展的动态列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265282/

相关文章:

python - For 循环迭代,范围从索引 1 重新开始

python - 在 Flask 中显示新图表

python - CFFI如何避免手动设置LD_LIBRARY_PATH

python - 收到 KeyError : '0_0' for my python program

python - 简单问题 : In numpy how do you make a multidimensional array of arrays?

programming-languages - 有人在商业上使用 pop11 语言吗?