2013-06-28 197 views
0

m從google教程學習python。我停留在與列表有關的練習上。 得到一個指數誤差python:IndexError:字符串索引超出範圍

lis[j]=words.pop()[i] 
IndexError: string index out of range 

我需要對列表進行排序,但是先從X的話應該是首當其衝。

代碼

def front_x(words): 
    i=0 
    lis=[] 
    j=0 
    k=0 
    words.sort() 

    while i<len(words): 
     if words[i][0:1]=="x": 
      lis[j]=words.pop()[i] 
      j+=1 
     i+=1 
    lis.extend(words) 
    while k<len(lis): 
     print(lis[k]) 
     k+=1 
    return 
+0

您可以發佈您正在使用的數據嗎? – John

回答

5

lis是一個空列表,任何指數將引發異常。

如果您想將元素添加到該列表中,請改爲使用lis.append()

注意,您可以遍歷序列直接,沒有必要讓自己的計數器:

def front_x(words): 
    lis = [] 
    words.sort() 

    for word in words: 
     if word.startswith("x"): 
      lis.append(word) 
    for entry in lis: 
     print(entry) 

您可以減少這進一步立即打印與x開始所有的話,沒有必要建立一個單獨的列表:

def front_x(words): 
    for word in sorted(words): 
     if word.startswith("x"): 
      print(word) 

如果你想排序的所有x話來第一個列表,使用自定義排序關鍵字:

def front_x(words): 
    return sorted(words, key=lambda w: (not w.startswith('x'), w)) 

首先用布爾標誌對.startswith('x')進行排序; FalseTrue之前排序所以我們否定了那個測試,然後是這個單詞本身。

演示:

>>> words = ['foo', 'bar', 'xbaz', 'eggs', 'xspam', 'xham'] 
>>> sorted(words, key=lambda w: (not w.startswith('x'), w)) 
['xbaz', 'xham', 'xspam', 'bar', 'eggs', 'foo'] 
+0

如果以x開頭的單詞已按字母順序排列,則方法工作。但如果不是,這會失敗。 練習說的是按字母順序排列單詞,首先排列以「x」開頭的單詞。 – shanzyshan

+0

@shanzyshan:不,它不會。該鍵返回一個元組;在對第一個值進行排序後,這些項目將在第二個值上排序。 –

+0

@馬丁。 okk我會試試這個。 – shanzyshan

0

i need to sort the list but the words starting with x should be the first ones.

補充到@馬亭的擴展答案自定義搜索鍵,你也可以試試這個,這是更接近你原來的做法,可能會更容易理解:

def front_x(words): 
    has_x, hasnt = [], [] 
    for word in sorted(words): 
     if word.startswith('x'): 
      has_x.append(word) 
     else: 
      hasnt.append(word) 
    return has_x + hasnt 

關於你的原代碼有什麼問題,實際上有三個問題行

lis[j]=words.pop()[i] 
  1. lis[j]只能當名單已有j個元素,但你要添加項目最初爲空列表中,你應該使用lis.append(...)代替。
  2. 要從列表中刪除索引i處以「x」開頭的單詞,但pop()將始終刪除最後一個項目。 pop()用於堆棧;從不從列表中刪除項目,同時使用索引進行循環!
  3. 您在之後應用[i]運算符您已從列表中彈出該項,即,您正在訪問這個詞的i個字母,它可能會更短;因此IndexError