如何从 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/