mylist = ["a", "apple", "b", "ball", "c", "cat"]
mylist[6] = "value"
print(mylist)
错误:
IndexError: list assignment index out of range
我记得在javascript中按索引分配值,它在python中不起作用?
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
在 python 中,如果索引不存在,则单一分配不起作用。Javascript 数组是“稀疏的”,您可以在任何索引处存储一个值。相反,python 列表具有定义的大小,并且仅允许在现有索引中分配。
如果要在最后添加,请使用mylist.append(value)
,
如 birye 所述,您可以使用 SparseList 完成您的要求。或者你总是可以使用附加。在 python 字典中,虽然你可以有任何索引分配说,
dic = {}
dic['1'] = 100
dic['2'] = 200
所以你能做的就是这样写,
list = {}
i = 1 #Your index
list[str(i)] = value #Your value
这可能会稍微增加执行时间。如果您引用任何未分配的索引,则会引发 IndexError 异常。
您可以通过首先创建一个对象列表来实现这一点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"]