在Python中按索引填充列表/数组?

时间:2009-05-15 16:57:25

标签: python list

这可能吗:

myList = []

myList[12] = 'a'
myList[22] = 'b'
myList[32] = 'c'
myList[42] = 'd'

当我尝试时,我得到:

# IndexError: list assignment index out of range # 

7 个答案:

答案 0 :(得分:50)

在您为其编制索引之前,您必须预先填写某些内容(例如0None):

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