2014-01-12 30 views
1

在我正在写一个程序来创建一个字符列表中的单词列表,我得到一个“列表索引超出范围”异常。为什么我不能在Python的空列表中追加一个字符?

def getlist(filename): 
    f = open('alice.txt','r') 
    charlist = f.read() 
    wordlist = [] 
    done = False 

    while(not done): 
    j = 0 
    for i in range(0,len(charlist)): 
     if charlist[i] != ' ' and charlist[i] != '\n': 
     wordlist[j] += charlist[i] 
     else: j+= 1 
     done = i == len(charlist)-1 
    return wordlist 

于是我开始用列表是如何工作的玩耍,结果发现:

list = ['cars'] 
list[0]+= '!' 

list = ['cars!']

然而,随着:

list = [] 
list[0]+= '!' 

我得到一个出来的边界错误。为什么它不这样做似乎合乎逻辑:list= ['!']?我该如何解决这个问题?如果我必须用某些东西进行初始化,我将如何知道列表所需的大小?有没有更好的,更传统的方法来做我想做的事情?

+1

想要得到你想要的东西的简单方法是'wordlist = charlist.split()'。 –

+0

追加是你正在为之工作。然而你真正要问的是为什么'!'当列表中有内容而不是列表中的列表时,将其“列入”列表以及空列表。那么在一个你有汽车的话。所以当你说list [0]时,你实际上并不是要求返回列表,而是字符串'cars',所以你要添加“!”到它。如果你要求列表[0]没有任何内容,列表中没有任何内容。这就是为什么你看到边界错误。 – jwillis0720

回答

2

['cars']是包含一个元素的列表。该元素是字符串'cars',其中包含4个字符。

list[0] += '!'实际上做了3件独立的事情。 list[0]部分在位置0处选择list的元素。+=部分都连接两个字符串(如'cars' + '!' would),并将结果字符串存储回list的第0个插槽中。

当您尝试将其应用于空的列表时,由于没有这样的元素,它在“选择位置0处的元素”部分时失败。你期待它的行为好像你没有空的列表,而是[''];该列表包含一个元素是空的字符串。您可以轻松地将!附加到空字符串的末尾,但在您的示例中,您没有空字符串。

2

要添加到列表中,包括空单,使用append()方法:

>>> mylist = [] 
>>> mylist.append('!') 
>>> mylist 
['!'] 
+3

有趣的是,问题是“为什么我不能追加”,答案是“use'.append()'”。 :^) – DSM

0

然而,随着:

list = [] 
list[0]+= '!' 

我得到一个出界失误。为什么不这样做似乎是合乎逻辑的: list= ['!']

因为不是逻辑在Python中。为了追加'!'list[0],list[0]必须首先存在。它不会奇迹般地变成一个空串,让你连接感叹号。在一般情况下,无论如何,Python无法找出哪种“空”元素可以提升。

在列表上提供了append方法,以便将元素附加到列表中。但是,你在做什么是大规模过度复杂的事情。如果你想要的是由文件中的单词的列表,这是一样容易:

def getlist(filename): 
    with open(filename) as f: 
     return f.read().split() 
+0

我不这样做的原因是,文本的元素是:',','。' ,'爱丽丝 - 没有'等。 – triplebig

0

你的错误不是从语句list[0]+= '!',其访问一个空列表是超出范围的错误:

>>> my_list = list() 
>>> my_list[0] 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
IndexError: list index out of range 
>>> 

而且+=不用于追加在列表中,其用于连接字符串或数字加法,并在内部调用以下方法。

__iadd__(...) 
    x.__iadd__(y) <==> x+=y 
相关问题