Python 列表 - “保留”空间(~ 调整大小)

新手上路,请多包涵

我得到了一个列表 l 我想做作业:

 l[index] = val

但可能存在列表太小的情况。

所以,我想确保我有空间容纳新价值。 Sometimes I need to fill the new space with empty strings '' , and sometimes with other objects (like empty lists [] , False or None )。

对于此任务,我使用以下过程:

 def ResizeList(l, size, fill_with=None):
    l += [fill_with]*(size-len(l))

(注意:即使 size-len(l)<=0 也能正常工作)(注意:因为我对 保留空间 感兴趣,所以我 故意不将其截断 为较短的列表)

像那样:

 ResizeList(l, index+1)
l[index] = val

(当填充其他对象时,就像: ResizeList(l, index+1, [])

有更多的 pythonic 方法吗?是否有一些内置函数或库函数可以执行此操作?

我主要使用 Python-3.x,但了解 Python-2x 的知识很有用,也很受欢迎。

澄清:请不要告诉我 dict ,因为我需要 list

对于那些希望我更具体的人:

问题陈述表明它是关于 list 类型。使用 dict 这里不是一个选项或解决方案。这是有原因的,特别是与领域相关(我正在做一个必须显示一些渐近行为的实验原型, 而不是- 正如你可能习惯的那样 - 一个程序的原型。如果它是“只是一个程序的原型”,然后我同意使用字典和其他评论)。我有以下假设:

  • 我有很多列表(需要关心内存和性能开销)
  • 由于工作流程和原型的需要,我无法调用手写的 C/C++ 扩展
  • 在计算过程中,最终的列表大小是未知的
  • 我们知道在和列表中会很 密集
  • 列表单元格以未知顺序写入和覆盖

这些只是我强调我需要 list 而不是 dict 的几个原因。对于那些对更多细节感兴趣或想讨论 dict 的人,请 在此处查看我们如何在评论中讨论

原文由 Grzegorz Wierzowiecki 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 527
1 个回答

如果您确定列表——而不是 dict 是您用例的最佳数据结构,我建议使用以下类:

 class rlist(list):
  def __init__(self, default):
    self._default = default
  def __setitem__(self, key, value):
    if key >= len(self):
      self += [self._default] * (key - len(self) + 1)
    super(rlist, self).__setitem__(key, value)

l = rlist(0)
print(l)
l[10] = 20
print(l)
l[5] = 14
print(l)

此类检查分配给的索引是否超出列表的当前长度,并根据需要自动扩展列表。

该代码与 Python 2 和 3 兼容(已通过 2.6.5 和 3.1.2 测试)。

如果结构密集并且您需要尽快通过索引找到元素,则此类可能会很方便。如果结构稀疏,您可能应该考虑使用字典。

原文由 NPE 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题