【问题标题】:Assigning a value to list by index out of range [duplicate]按超出范围的索引为列表分配值[重复]
【发布时间】:2012-05-24 17:14:22
【问题描述】:
mylist = ["a", "apple", "b", "ball", "c", "cat"]
mylist[6] = "value"
print(mylist)

错误:

IndexError: list assignment index out of range

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

【问题讨论】:

  • 是的,它不起作用。使用append。或者,如果您实际上是在尝试访问第 6 个元素,请改用 5
  • Python 的列表是 0 索引的。
  • @jamylak 我想在列表中添加新值,使用 append 函数。

标签: python list


【解决方案1】:

您所要求的可以通过 birrye 描述的 SparseList 来完成。或者你总是可以使用附加。在 python 字典中,虽然你可以有任何索引分配说,

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

所以你可以这样写,

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • @SiriusKoder - 你的意思是输入一个新值? Python 的列表不是这样工作的。您必须创建自己的包装类来实现稀疏列表(基本上是创建一个包含一堆 None 值的列表。
    • @versimilitude 那么他就可以使用mylist[-1]
    • @verisimilitude - 他想要一个稀疏列表,允许分配到列表中的任意位置,即使由于appending 导致该位置还不存在。
    • @SiriusKoder - 查看我修改后的答案,了解稀疏列表实现,它继承了 Python 的内置 list 类并允许类似 Javascript 的列表行为。
    • 对于一些繁重的稀疏输入工作,我会选择使用带有键的字典作为索引。这样做的好处是在访问项目时不必在其间创建所有条目。
    【解决方案3】:

    您可以通过首先创建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"]
    

    【讨论】:

    • 您还可以超出列表范围,即mylist[13:13] = [1]。这会导致分配被附加到列表的末尾。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2014-11-30
      • 2013-05-31
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多