为什么list.insert()不会留下空白?

时间:2016-10-07 09:42:50

标签: python python-3.x

这可能是一个愚蠢的问题,但想象一下以下情况:您正在填写一个列表列表,一旦完全填充,就会转换为DataFrame。您事先并不知道最终尺寸,因此无法以正确的尺寸进行预分配。

在填充行(即嵌套列表)时,如果您尝试将列表索引超出它的长度,它将给出IndexError,这不是不合理的:

>>> row = list()
>>> row.append('a')
>>> row[3] = 'c'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

但是,如果您使用insert(index, element)方法,我原本预计会在列表中出现空白(至少可以选择有间隙)。毕竟,如果我只想添加到最后,我会使用append(element)代替。

>>> row = list()
>>> row.append('a')
>>> row.insert(3,'c')
>>> row
['a', 'c']

正如我们上面所看到的,情况并非如此。为什么会这样?

编写一个自定义包装函数,迭代列表,唯一可能的方法来获得一个有缺口的列表,例如: ['a', None, 'c'](或其他一些默认值)?

2 个答案:

答案 0 :(得分:2)

不,Python列表不支持差距;他们并不稀疏。 “插入”超过结尾与添加相同。

请注意,None与其他语言中的空指针不同,它只是一个单独的对象,其他语言经常使用空指针;否则它仍然只是另一个对象。

如果您需要稀疏数据结构,最简单的方法是使用字典:

row = {}
row[3] = 'c'

答案 1 :(得分:1)

可能不直接通过list中的函数。如何将其存储在dict中,然后在完全填充后创建列表?

d = {index: item for index, item in yourData}
result = [None]*max(d.keys())
for index, item in d.items():
    result[index] = item
#result is now a list with None filled at indices that do not have data..