2015-11-06 73 views
0

我是Python中的新手學生(以及一般編程)。Python「列表分配索引超出範圍」

我應該做一個python程序,用它打開兩個帶有隨機數字的文件,並創建一個新的文件,其編號從低到高排序。

所以我做了這個迭代使用兩個for循環遍歷所有數字的代碼,搜索最低的,非常基本的東西,比存儲數字和它的位置,附加到一個Lmix列表,將被保存在最終文件並存儲號碼位置以從該列表中刪除它,以便它不會再被找到。

變量是葡萄牙語,但我在評論中翻譯了他們,其餘都是不言自明的。

arq1 = open("nums1.txt","r") 
arq2 = open("nums2.txt","r") 

arqmix = open("numsord.txt","w") 

L1 = arq1.readlines() 
L2 = arq2.readlines() 
Lmix = [] 

L1 = list(map(int,L1)) # converts lists into int 
L2 = list(map(int,L2)) 

cont = 0 

menor = L1[0] # "Menor" is the variable that stores the lowest number it finds 
menorpos = 0 # "Menorpos" is the position of that variable in the list, so it can delete later 
listdec = 0 # "listdec" just stores which list the number was from to delete. 

while cont != (len(L1)+len(L2)): 

# while loops that finds the lowest number, stores the number and position, appends to the Lmix and deletes from the list so it won't be found on next iteration 

    n = 0 
    for n,x in enumarate(L1): 
     m = 0 
     for m,y in enumarate(L2): 
      if x<menor: 
       menor = x 
       menorpos = n 
       listdec = 0 
      elif y<menor: 
       menor = y 
       menorpos = m 
       listdec = 1 
      m += 1 
     n += 1 

    Lmix.append(menor) 
    if listdec == 0: 
     del L1[menorpos] 
    elif listdec == 1: 
     del L2[menorpos] 
    cont += 1 

for x in Lmix: 
    arqmix.write("%d\n"%x) 

arq1.close() 
arq2.close() 
arqmix.close() 

但每次我運行它,出現此錯誤:

回溯(最近通話最後一個): 文件 「C:/Users/Danzmann-Notebook/PycharmProjects/untitled/aula18.py」第41行,在 德爾L2 [menorpos] IndexError:列表分配索引超出範圍

我知道這意味着什麼,但我只是不明白爲什麼會發生,我怎麼能解決這個問題。

任何幫助,將不勝感激。

在此先感謝,對於任何語法錯誤感到抱歉,英語不是我的母語。

+0

你爲什麼明確增加for循環中的'm'和'n'?這已經爲你完成了。 –

回答

0

要調試這個問題,我加入了while循環兩條print語句 - 這是我所看到的:

Cont: 0 L1 [9, 2, 6, 4, 7] L2 [3, 15, 5, 8, 12] Lmix [] 
    Found menor 2 menorpos 1 listdec 0 

Cont: 1 L1 [9, 6, 4, 7] L2 [3, 15, 5, 8, 12] Lmix [2] 
    Found menor 2 menorpos 1 listdec 0 

Cont: 2 L1 [9, 4, 7] L2 [3, 15, 5, 8, 12] Lmix [2, 2] 
    Found menor 2 menorpos 1 listdec 0 

Cont: 3 L1 [9, 7] L2 [3, 15, 5, 8, 12] Lmix [2, 2, 2] 
    Found menor 2 menorpos 1 listdec 0 

Cont: 4 L1 [9] L2 [3, 15, 5, 8, 12] Lmix [2, 2, 2, 2] 
    Found menor 2 menorpos 1 listdec 0 

Traceback (most recent call last): 
    File "<pyshell#30>", line 29, in <module> 
    del L1[menorpos] 
IndexError: list assignment index out of range 

第一次循環,它工作正常 - 它發現任一列表中的最低項,爲menor,menorpos和listdec分配正確的值,並刪除該值。

第二次通過循環時,它失敗了,因爲menor已經是最低值了 - 它沒有找到更低的值,所以它不會更新menor,menorpos和listdec的值。它使用以前的值(現在不正確)。

它重複使用錯誤的值,直到它從中刪除的列表太短;那麼它會拋出一個錯誤。


問題可以更簡單地加以解決:

def loadnums(filename): 
    with open(filename) as inf: 
     nums = [int(line) for line in inf] 
    return nums 

nums = loadnums("num1.txt") + loadnums("num2.txt") 
nums.sort() 

with open("numsord.txt", "w") as outf: 
    outf.write("\n".join(str(num) for num in nums)) 
1

你不需要增加m和n明確。這已經爲你完成了。這可能會導致索引超出範圍。

m += 1 
n += 1