2011-04-13 84 views
114

请考虑下面的代码:IndexError:列表分配索引超出范围

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

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

print j 

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

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

我想这是简单的东西我不明白。有人可以清除它吗?

+3

'append'是为您的使用情况下,正确的解决方案。然而, python列表上有一个插入方法,它可以直接插入列表中的第i个位置。 'j.insert(k,l)' – opensourcegeek 2015-09-30 08:46:47

回答

183

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

尽量不要使用以下,以一个新的元素添加到列表的末尾:

for l in i: 
    j.append(l) 
+1

好的,非常感谢。我不知道应该赞扬哪一个,因为有三个几乎相同的答案。我认为这是最具描述性的。干杯 – Vladan 2011-04-13 18:11:59

13

j.append(l)而不是j[k] = l并且完全避免k

+2

更短(更Pythonic?)的方式可能是'j + = [l]' – 2011-04-13 18:05:06

+2

@BlaXpirit:我认为它会给垃圾收集器带来负担。 – khachik 2011-04-13 18:06:57

+2

@BalXpirit:鉴于这只保存了几个字符(尤其是因为你需要添加空格让它可以接受),而'.append'更加普遍(可能是出于某种原因 - 我认为理解起来要容易一些),在任何方面都不是非常出众。 (编辑@khachik:不,'+ ='原地修改) – delnan 2011-04-13 18:08:18

6
j.append(l) 

此外,还要避免使用小写字母“L的”,因为它很容易让他们与混淆1的

27

你的另一个选择是初始化j

j = [None]*max(i) 
9

对于示例你贴,你也可以使用列表理解:

j = [l for l in i] 

或只是做一个副本:

j = i[:] 
+0

第二个建设是整洁 – javadba 2018-02-17 12:10:33

1

另一种方式:

j=i[0] 
for k in range(1,len(i)): 
    j = numpy.vstack([j,i[k]]) 

在这种情况下j将是一个numpy的array

3

我觉得python方法insert什么是哟你在寻找;

在位置i插入元素x。

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

array.insert(1,2) 

print array 

# prints [2,2,3,4,5] 
3

你可以使用字典(类似于关联数组)对于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 

会打印:

{0: 1, 1: 2, 2: 3, 3: 5, 4: 8, 5: 13} 
相关问题