这可能吗:
myList = []
myList[12] = 'a'
myList[22] = 'b'
myList[32] = 'c'
myList[42] = 'd'
当我尝试时,我得到:
# IndexError: list assignment index out of range #
答案 0 :(得分:50)
在您为其编制索引之前,您必须预先填写某些内容(例如0
或None
):
myList = [None] * 100 # Create list of 100 'None's
myList[12] = 'a' # etc.
或者,使用dict而不是列表,如Alex Martelli suggested。
答案 1 :(得分:27)
对于“稀疏列表”,您可以改为使用dict
:
mylist = {}
mylist[12] = 'a'
等。如果你想要一个真实的列表(用[]
初始化它,不是 ()
,当然! - )你需要将未设置的插槽填充到_some_thing,例如: None
,通过一点辅助函数或通过子类化list
。
答案 2 :(得分:18)
这是一个快速列表包装器,如果您尝试将值分配给超过其长度的索引,则会使用零自动扩展列表。
class defaultlist(list):
def __setitem__(self, index, value):
size = len(self)
if index >= size:
self.extend(0 for _ in range(size, index + 1))
list.__setitem__(self, index, value)
现在你可以这样做:
>>> a = defaultlist([1,2,3])
>>> a[1] = 5
[1,5,3]
>>> a[5] = 10
[1,5,3,0,0,10]
答案 3 :(得分:2)
不能用列表中的其他位置填充(例如None
或空字符串)。尝试使用您编写的代码将元素插入到列表中会产生IndexError
。
还有mylist.insert
,但是这段代码:
myList.insert(12,'a')
只会在列表中的第一个未占用位置插入“a”(使用您的示例将为0)。
所以,正如我所说,在你可以在myList[12]
插入一些东西之前,必须在索引0-11的列表中有一些东西。
答案 4 :(得分:2)
如果您未提前知道列表的大小,可以使用try / except,然后在以下内容中扩展列表:
L = []
def add(i, s):
try:
L[i] = s
except IndexError:
L.extend([None]*(i-len(L)+1))
L[i] = s
add(12, 'a')
add(22, 'b')
-----更新-------------------------------------- ------- 强>
Per tgray的评论:如果你的代码很可能在大多数情况下抛出 ,你应该每次检查List的长度,并避免异常:
L = []
def add(i, s):
size = len(L)
if i >= size:
L.extend([None]*(i-size+1))
L[i] = s
答案 5 :(得分:1)
万一有人需要,我想出了解决问题的方法,我需要计算很多因子,其中一些可以重复,所以这里是我的解决方案:
factorials = {}
def calcFact(v):
try:
return factorials[v]
except KeyError:
factorials[v] = math.factorial(v)
return factorials[v]
<强>测试用例:强>
calcFact(99000)
calcFact(90900)
calcFact(90090)
calcFact(90009)
calcFact(90009) #repeated
calcFact(90009) #repeated
<强>结果:强>
重复数学计算: 1.576 s
使用上面的代码(存储重复值的列表): 1.011 s
答案 6 :(得分:0)
在三联画的顶部构建。.如果要获取任意尺寸的列表
class dynamiclist(list):
""" List not needing pre-initialization
Example:
l = dynamiclist()
l[20][1] = 10
l[21][1] = 20
"""
def __setitem__(self, index, value):
size = len(self)
if index >= size:
self.extend(dynamiclist() for _ in range(size, index + 1))
list.__setitem__(self, index, value)
def __getitem__(self, index):
size = len(self)
if index >= size:
self.extend(dynamiclist() for _ in range(size, index + 1)) # allows dimensions > 1
return list.__getitem__(self, index)
示例
l = dynamiclist()
l[20][1] = 10
l[21][1] = 20