mylist = ["a", "apple", "b", "ball", "c", "cat"]
mylist[6] = "value"
print(mylist)
错误:
IndexError: list assignment index out of range
我记得在javascript中按索引分配值,它在python中不起作用?
答案 0 :(得分:13)
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
答案 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"]