2017-10-12 91 views
2

因此,我對編程頗爲陌生,最近剛剛開始使用Classes,我們應該製作一個可以加載到單獨文本文件中的電話簿。For循環錯誤:列表索引超出範圍

但是我仍然在本節中遇到問題,當我進入for-loop。它擊中

if storage[2] == permaStorage[i].number: 

磚牆,並告訴我「IndexError:列表索引超出範圍」。我幾乎可以肯定,這是由於permaStorage開始是空的,但即使當我試圖用電話簿的臨時實例填充時,它也會告訴我它超出範圍。它存在的主要原因是檢查permaStorage中是否存在電話號碼。

任何人都有一個很好的提示如何解決這個問題或解決它?

(很抱歉,如果文字寫的不好,剛剛加入這個網站,而不是確定的樣式)

class Phonebook(): 
    def __init__(self): 
     self.name = '' 
     self.number = '' 

def Add(name1, number1): 
    y = Phonebook() 
    y.name = name1 
    y.number = number1 
    return y 

def Main(): 
    permaStorage = [] 
    while True: 
     print " add name number\n lookup name\n alias name newname\n change name number\n save filename\n load filename\n quit\n" 
     choices = raw_input ("What would you like to do?: ") 
     storage = choices.split(" ") 
     if storage[0] == "add": 
      for i in range(0, len(permaStorage)+1): 
       if storage[2] == permaStorage[i].number: 
        print "This number already exists. No two people can have the same phonenumber!\n" 
        break 
       if i == len(permaStorage): 
        print "hej" 
        try: 
         tempbox = Add(storage[1], storage[2]) 
         permaStorage.append(tempbox) 
        except: 
         raw_input ("Remember to write name and phonenumber! Press any key to continue \n") 
+0

爲什麼'len(permaStorage)+ 1' in'for i in range(0,len(permaStorage)+1):'? –

+0

我添加了一個定義的範圍等於permaStorage的長度。 +1是首先讓它開始,但最有可能沒有必要,並且稍後會導致問題。 –

回答

0

我認爲問題是,permaStorage是空的列表,然後ü嘗試到:

for i in range(0, len(permaStorage)+1): 
      if storage[2] == permaStorage[i].number: 

將導致一個錯誤,因爲permaStorage有0項,但ü試圖讓第一(i = 0,permaStorage [0] )項目。

我覺得你應該先更換第二if語句:

for i in range(0, len(permaStorage)+1):  
    if i == len(permaStorage): 
       print "hej" 
       try: 
        tempbox = Add(storage[1], storage[2]) 
        permaStorage.append(tempbox) 
    if storage[2] == permaStorage[i].number: 
       print "This number already exists. No two people can have the same phonenumber!\n" 
       break 

因此,在這種情況下,如果perStorage是空白的,你會附加一些值,和接下來的if語句都會好的。

+0

謝謝!它的確行得通,但它在第二部分引起了一個小問題,它打印出「他的號碼已經存在,沒有兩個人可以有相同的號碼!\ n」但是這是一個很容易修復的小問題 –

+0

是的,你可以在for循環開始時添加一個額外的驗證,比「permaStorage」爲空,例如:如果不是permaStorage:tempbox = Add(storage [1],storage [2]) permaStorage.append(tempbox) –

0

索引在Python從零開始。因此,長度爲5的列表的最後一個元素索引爲4,從0開始。將範圍改爲range(0, len(permastorage))

+0

謝謝!可悲的是,它並沒有解決問題,因爲permaStorage的長度是空的。它遇到的錯誤是當它試圖檢查'如果存儲[2] == permaStorage [i]。number:' –

+0

你也可以迭代它像列表 'elem在permastorage: #做東西elem 如果存儲[2] == elem.number' 試試看。 – yesemsanthoshkumar

+0

它沒有工作。它完全跳過了整個循環。它在循環開始的時候遇到的主要問題(例如,當它是'len(permaStorage)+ 1'時,它的列表索引超出了範圍。它檢查'storage [2] == permaStorage [i] .number' –

0

您應迭代到列表的最後一個元素,而不是超出。

嘗試 -

for i in range(0, len(permaStorage)):

range()產生號碼的列表是從一開始,但不包括結束,所以range(3) == [0, 1, 2]

所以,如果你的名單x的長度爲10,range(0, len(x))會給你0到9,這是你列表元素的正確索引。

1添加到len(x)將生成範圍0 through 10,並且當您嘗試訪問x[10]時,它將失敗。

相關問題