2011-04-13 72 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} 
相關問題