3

我是 Python 新手。我有一系列对象需要插入到列表的特定索引处,但它们是乱序的,所以我不能只是附加它们。如何在必要时增加列表以避免 IndexErrors?

def set(index, item):
    if len(nodes) <= index:
        # Grow list to index+1
    nodes[index] = item

我知道您可以通过创建一个具有初始容量的列表,nodes = (index+1) * [None]但是通常的方式是什么?以下似乎效率不高:

for _ in xrange(len(nodes), index+1):
    nodes.append(None)

另外,我想我应该使用标准库中的一个类而不是内置列表?

4

3 回答 3

7

这是最好的方法。

>>> lst.extend([None]*additional_size)
于 2012-04-14T17:06:52.210 回答
2

哎呀,好像我一开始误解了你的问题。如果您要问如何扩展列表的长度,以便可以在大于列表当前长度的索引处插入一些东西,那么lst.extend([None]*(new_size - len(lst))正如其他人所建议的那样,这可能是要走的路。当然,如果您事先知道您需要的最大索引是多少,那么提前创建列表并用Nones 填充它是有意义的。


作为参考,我留下原文:在现有列表的中间插入一些东西,通常的方法是不用担心自己增加列表。列表对象带有一种insert方法,可以让您在列表中的任何位置插入对象。所以代替你的set功能,只需使用

lst.insert(item, index)

或者你可以做

lst[index:index] = item

它做同样的事情。Python 会为你调整列表的大小。

标准库中不一定有任何类可以用来代替list,尤其是当您需要这种随机访问插入时。但是,您应该注意collections模块中的一些类,因为它们在其他情况下可能很有用(例如,如果您总是附加到列表的一端,并且您事先不知道有多少项目您需要,deque将是合适的)。

于 2012-04-14T17:15:20.033 回答
1

也许是这样的:

lst += [None] * additional_size

(您不应该调用您的列表变量列表,因为它也是列表构造函数的名称)。

于 2012-04-14T17:03:45.177 回答