Python 为什么list.insert()不留间隙?

Python 为什么list.insert()不留间隙?,python,python-3.x,Python,Python 3.x,这可能是一个愚蠢的问题,但想象一下下面的场景:您正在填充一个列表列表,一旦它被完全填充,它将被转换为一个DataFrame。您事先不知道最终尺寸,因此无法预先分配正确的尺寸 填充行(即嵌套列表)时,如果尝试索引列表超出其长度,则会给出一个索引器,这并非不合理: >>> row = list() >>> row.append('a') >>> row[3] = 'c' Traceback (most recent call last): F

这可能是一个愚蠢的问题,但想象一下下面的场景:您正在填充一个列表列表,一旦它被完全填充,它将被转换为一个
DataFrame
。您事先不知道最终尺寸,因此无法预先分配正确的尺寸

填充行(即嵌套列表)时,如果尝试索引列表超出其长度,则会给出一个
索引器,这并非不合理:

>>> 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
正如我们在上面看到的,情况并非如此。为什么会这样


编写在列表上迭代的自定义包装函数是否是获取有间隙列表的唯一可能方法,例如
['a',None',c']
(或其他一些默认值)?

可能不是直接通过
列表中的函数。将其存储在一个
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..

可能不是直接通过
列表中的函数执行的。将其存储在一个
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..

不,Python列表不支持间隙;他们并不稀少。”在末尾插入“结束”与追加相同

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

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

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

不,Python列表不支持间隙;他们并不稀少。”在末尾插入“结束”与追加相同

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

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

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

None
只是一个对象,不是空指针;您的预期输出中没有“差距”。是的,您必须构建一个自定义函数来实现这一点。
l.insert(index,value)
l[index:index]=[value]
是一样的,切片总是有效的(如果需要,生成一个空切片),如果索引太大,则标准化为列表的长度。如果要构建
数据帧
,则使用dict作为稀疏表示的dict有一个定制的构造函数:
pd.DataFrame.from_dict
,它接受一个
定向
参数,该参数默认为
,但如果每个子目录代表一行,则可以设置为
索引。这将用
NaN
来填补空白。例如,试试这个:
pd.DataFrame.from_dict({'A':{1:'A',2:'b'},'b':{1:'A',3:'C'},orient='index')
看看它和
pd.DataFrame.from_dict({'A':{1:'A',2:'b'},'b','b','A',3:'C'})之间的区别。
不只是一个空指针;您的预期输出中没有“差距”。是的,您必须构建一个自定义函数来实现这一点。
l.insert(index,value)
l[index:index]=[value]
是一样的,切片总是有效的(如果需要,生成一个空切片),如果索引太大,则标准化为列表的长度。如果要构建
数据帧
,则使用dict作为稀疏表示的dict有一个定制的构造函数:
pd.DataFrame.from_dict
,它接受一个
定向
参数,该参数默认为
,但如果每个子目录代表一行,则可以设置为
索引。这将用
NaN
来填补空白。例如,试试这个:
pd.DataFrame.from_dict({'A':{1:'A',2:'b'},'b':{1:'A',3:'C'},orient='index')
看看它和
pd.DataFrame.from_dict({'A':{1:'A',2:'b'},'b','A',3:'C'})