3
mylist = ["a", "apple", "b", "ball", "c", "cat"]
mylist[6] = "value"
print(mylist)

错误:

IndexError: list assignment index out of range

我记得在javascript中按索引分配值,它在python中不起作用?

4

4 回答 4

14

Python 的列表是 0 索引的。您的列表中有 6 个元素,因此您可以使用从0到的任何内容对它们进行索引5。尝试超出这些范围将不适用于普通list类型,但您似乎希望将索引用作隐式列表扩展。

为此,您需要一个稀疏容器,这是一个子类列表的快速实现。

class SparseList(list):
    def __setitem__(self, index, value):
        """Overrides list's __setitem__ to extend the list
           if the accessed index is out of bounds."""
        sparsity = index - len(self) + 1
        self.extend([None] * sparsity)
        list.__setitem__(self, index, value)

像这样使用:

In [8]: sl = SparseList()

In [9]: print(sl)
[]

In [10]: sl[3] = "hi"

In [11]: print(sl)
[None, None, None, 'hi']

还有你的具体例子:

In [11]: mylist = SparseList(["a", "apple", "b", "ball", "c", "cat"])

In [12]: print mylist
['a', 'apple', 'b', 'ball', 'c', 'cat']

In [13]: mylist[6] = "value"

In [14]: print mylist
['a', 'apple', 'b', 'ball', 'c', 'cat', 'value']

如果你想要少一点自制的东西,试试blist

于 2012-05-17T05:46:05.560 回答
5

在 python 中,如果索引不存在,则单一分配不起作用。Javascript 数组是“稀疏的”,您可以在任何索引处存储一个值。相反,python 列表具有定义的大小,并且仅允许在现有索引中分配。

如果要在最后添加,请使用mylist.append(value),

于 2012-05-17T05:48:19.960 回答
1

如 birye 所述,您可以使用 SparseList 完成您的要求。或者你总是可以使用附加。在 python 字典中,虽然你可以有任何索引分配说,

dic = {}
dic['1'] = 100
dic['2'] = 200

所以你能做的就是这样写,

list = {}
i = 1 #Your index
list[str(i)] = value #Your value

这可能会稍微增加执行时间。如果您引用任何未分配的索引,则会引发 IndexError 异常。

于 2012-05-17T06:38:08.453 回答
0

您可以通过首先创建一个对象列表来实现这一点None,但这可能不是最好的做事方式。

mylist = [None] * 10
mylist[0:5] = ["a", "apple", "b", "ball", "c", "cat"]
mylist[6] = "value"

或者,您可以只将元素附加到列表的末尾。

mylist = ["a", "apple", "b", "ball", "c", "cat"]

# create 7th element
mylist += ["value"]

# create 10th element
mylist += [None] * 2 + ["value2"]
于 2012-05-17T05:50:42.817 回答