【问题标题】:Why can't I append a char to an empty list in Python?为什么我不能在 Python 中将 char 附加到空列表中?
【发布时间】:2014-01-30 23:43:57
【问题描述】:

在我编写的一个程序中,我正在编写一个从字符列表创建单词列表的程序,我收到“列表索引超出范围”异常。

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= ['!']?我该如何解决这个问题?如果我必须用某些东西进行初始化,我怎么知道列表所需的大小?有没有更好、更传统的方法来做我正在尝试的事情?

【问题讨论】:

  • 获得所需内容的简单方法是wordlist = charlist.split()
  • 追加是你的工作。但是,您实际上要问的是为什么“!”当列表中有内容而不是空列表时,将其“附加”到列表中。那么在一个你有汽车这个词。因此,当您说 list[0] 时,您实际上并没有要求返回列表,而是要求返回字符串“cars”,因此您要添加“!”给它。如果您要求 list[0] 中没有任何内容,则 list 中没有任何内容。这就是您看到边界错误的原因。

标签: python list exception


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 问题是“为什么我不能追加”而答案是“使用.append()”,这有点有趣。 :^)
    【解决方案3】:

    但是,与:

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

    我得到一个越界错误。为什么它不做看起来合乎逻辑的事情: list= ['!']?

    因为在 Python 中 是合乎逻辑的。要将'!' 附加到list[0],首先必须存在list[0]。它不会神奇地变成一个空字符串供您连接感叹号。在一般情况下,无论如何,Python 无法确定要使用哪种“空”元素。

    append 方法在列表中提供,以便将元素附加到列表中。但是,您正在做的是大量过于复杂的事情。如果你想要的只是一个由文件中的单词组成的列表,那很简单:

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

    【讨论】:

    • 我不这样做的原因是文本包含以下元素:',','。' , '爱丽丝--没有' 等等。
    【解决方案4】:

    您的错误不是来自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 
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2017-04-29
      • 2021-03-26
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多