2012-05-17 51 views
0
def most_popular_guests(file_in): 
    f=file(file_in,'r') 
    listoflines=f.readlines() 
    D={} 
    dict={} 
    title='' 

    for lines in listoflines: 
     if (lines.isupper()): 
      title=lines 
     else: 
      lines=lines.split(":") 
      names=(lines[1]).split(",") 
     for name in names: 
      if D.has_key(name): 
       D[name].append(Show_Appearance(title,lines[0])) 
      else: 
       D[name]=[Show_Appearance(title,lines[0])] 
       break 

    dict=longest(D) 


def longest(D):  
    max=0 
    d={} 
    for name in D.keys(): 
     value = D[name] 
     if max<len(value): 
      max=len(value) 

    for keys in D.keys: 
     value=D[keys] 
     if len(value)==max: 
      d[key]=value 

    return d 

我想找到一個字典,以最頻繁出現的人爲關鍵字,並將該人的顯示列表作爲值。保持這個列表索引超出範圍錯誤。如何避免列表索引超出範圍

+1

錯誤來自'names =(lines [1])。split(「,」)'line?這意味着有一行沒有':'的行,所以'lines.split(「:」)'的長度爲1. – Dougal

+1

不知道輸入文件的內容,很難找到確切的位置出錯。你能提供一個樣本輸入和終端中的錯誤跟蹤嗎? – nye17

+4

請勿像'dict = {}那樣命名變量'dict'因爲每個字符串都是不可變的,所以不需要設置'title =''',因此您不會追加它。 –

回答

3

與腳本普遍的問題是,它使錯誤的假設和不準備處理這種情況時的假設被證明是不正確:)

更具體地說,lines.split(":")不保證返回一個列表至少2個元素長,而其他代碼只是盲目地認爲訪問行[0]和行[1]是安全的。

如何處理這取決於您的目標 - 您可能希望忽略此類輸入,停止腳本或記錄警告。像這樣的東西會跳過格式錯誤的行:

 lines=lines.split(":") 
     if len(lines) < 2: 
      print "Woops, bad line: %s" % lines 
      continue