【问题标题】:Automatically growing lists in PythonPython中的自动增长列表
【发布时间】:2011-05-31 11:40:21
【问题描述】:

有没有办法在 Python 中制作一个自动增长的列表?我的意思是创建一个在引用尚不存在的索引时会增长的列表。基本上是 Ruby 数组的行为。

提前致谢!

【问题讨论】:

  • 嗯,您是在描述列表的工作方式。你在尝试什么不起作用?
  • 我的意思是,如果上下文超出范围,就会引发错误。我希望列表增长到可以容纳索引的大小;在 Ruby 中,这将用 Null 填充所有中间位置。
  • 您希望尚未存在的索引在第一次被引用时(以及它之前的所有元素)的内容是什么?应该是None 还是其他一些默认值?
  • 应该是赋值的;例如 a[100]=20。我不在乎分配了哪些空白位置,因为这些位置稍后会被覆盖。
  • 好的,如果有人询问a[1000] 的值,如果它还不存在,你想怎么办? IndexError 或者列表也应该增长到这个大小?

标签: python list


【解决方案1】:

当然可以,您只需要使用列表的子类即可。

class GrowingList(list):
    def __setitem__(self, index, value):
        if index >= len(self):
            self.extend([None]*(index + 1 - len(self)))
        list.__setitem__(self, index, value)

用法:

>>> grow = GrowingList()
>>> grow[10] = 4
>>> len(grow)
11
>>> grow
[None, None, None, None, None, None, None, None, None, None, 4]

【讨论】:

  • 谢谢,这正是我所需要的。
  • 请注意,这仅对密集数组真正有用,如果您需要稀疏数组的结构,那么您最好使用基于字典的解决方案。
  • 在函数中添加一个 'fillvalue' 参数...这样你就可以做 grow.__setitem__(10, 4, True) 例如
  • @Ant,__setitem__ 是一个特殊的方法,它不经常通过它的名字来调用,但就像例子中的grow[10] = 4
  • 我认为给特殊函数添加参数(甚至是默认参数)不是很好的python,如果规范发生变化并添加另一个参数怎么办。我认为如果您需要一个填充值,那么您应该将其添加到 __init__ 函数中,但这与从列表中继承的效果不佳,您需要更改 __new__ 方法,但我只是在尝试写一个简单的例子。
【解决方案2】:

列表在 python 中是动态的。它会在您的程序中始终自动增长(直到您点击 sys.maxsize)。

  l = list()
  l.append(item)

继续这样做。

【讨论】:

  • 不,我的意思是当引用超出范围的索引时它会增长。例如,当调用 a[100]=101 时,a=[1,2,3] 会增长。
  • a[3]a[99] 的值在这之后应该是什么?
  • 在Ruby中,中间元素设置为nil;在 Python 中,None 将是合乎逻辑的选择。
【解决方案3】:

不,但您可以使用字典(哈希表)来实现相同的目的。

【讨论】:

  • 谢谢,但我需要订购。
  • 那你可以试试OrderedDict 对象。 ;-)
  • 它们的键就像索引一样。差别不大,但在稀疏数组上节省了内存。扩展列表(替代)方法还会分配一堆未使用的对象,还会增加列表遍历的运行时间成本。
  • 我明白你的意思。但是,我想要这个的原因是为了实现一个数学算法,其中 indeces 的值很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2023-04-03
相关资源
最近更新 更多