IndexError:列表赋值索引超出范围

Vla*_*dan 174 python exception list

请考虑以下代码:

i = [1, 2, 3, 5, 8, 13]
j = []
k = 0

for l in i:
    j[k] = l
    k += 1

print j
Run Code Online (Sandbox Code Playgroud)

输出(Win 7 32位上的Python 2.6.6)是:

> Traceback (most recent call last): 
>     j[k] = l IndexError: list assignment index out of range
Run Code Online (Sandbox Code Playgroud)

我想这很简单,我不明白.有人可以清理它吗?

Ste*_*yne 284

j是一个空列表,但是您尝试[0]在第一次迭代中写入元素,该迭代尚不存在.

请尝试以下方法,将新元素添加到列表末尾:

for l in i:
    j.append(l)
Run Code Online (Sandbox Code Playgroud)

  • 好的,非常感谢.我不知道哪一个要赞美,因为有三个几乎相同的答案.我认为这是最具描述性的.干杯 (2认同)
  • 我可以看到,对于那些来自 PHP 或 C 等其他语言的人来说,这可能会非常令人困惑。 j 是一种列表类型,而不是数组。对于列表类型,我认为这是不可订阅的。如果来自其他语言,则非常令人困惑。 (2认同)

Rsh*_*Rsh 45

您的另一个选择是初始化j:

j = [None] * len(i)
Run Code Online (Sandbox Code Playgroud)

  • 您想使用len(i)而不是max。 (3认同)

kha*_*hik 23

j.append(l)而不是j[k] = l避免k.

  • 更短(更Pythonic?)的方式可能是`j + = [l]` (2认同)
  • @BlaXpirit:我认为它会给垃圾收集器带来负担. (2认同)
  • @BalXpirit:鉴于只保存了几个字符(特别是因为你需要为它添加空格以便接受)而且`.append`更为常见(也许是因为某种原因 - 我认为理解起来要容易一些) ,在任何方面都不是很优越.(编辑@khachik:不,`+ =`就地修改) (2认同)

Jas*_*ram 15

您还可以使用列表理解:

j = [l for l in i]
Run Code Online (Sandbox Code Playgroud)

或使用以下声明制作副本:

j = i[:]
Run Code Online (Sandbox Code Playgroud)

  • 如果唯一的目标是复制列表,则可以简单地说j = list(i)我认为问题更多是关于列表的行为,而不是特别需要复制元素的方法。 (2认同)

Tom*_*Tom 8

j.append(l)
Run Code Online (Sandbox Code Playgroud)

还要避免使用小写的"L's",因为它很容易与1混淆


wat*_*ter 5

我认为Python方法插入是你正在寻找的:

在元素x处插入元素x.

array = [1,2,3,4,5]

array.insert(1,20)

print(array)

# prints [1,2,20,3,4,5]
Run Code Online (Sandbox Code Playgroud)


Ced*_*ric 5

您可以为j使用字典(类似于关联数组)

i = [1, 2, 3, 5, 8, 13]
j = {} #initiate as dictionary
k = 0

for l in i:
    j[k] = l
    k += 1

print j
Run Code Online (Sandbox Code Playgroud)

将打印:

{0: 1, 1: 2, 2: 3, 3: 5, 4: 8, 5: 13}
Run Code Online (Sandbox Code Playgroud)