按索引将值分配给超出范围的列表

时间:2012-05-17 05:43:47

标签: python list

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

错误:

IndexError: list assignment index out of range

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

4 个答案:

答案 0 :(得分:13)

Python的列表是0索引的。您的列表中有6个元素,因此您可以使用05中的任何内容对其进行索引。尝试超出这些范围将无法使用正常的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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

你所要求的可以用barseye描述的SparseList来完成。或者你总是可以使用追加。在python词典中虽然你可以有任何索引作业说,

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

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

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

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

答案 3 :(得分: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"]