【问题标题】:Python - string index out of range issuePython - 字符串索引超出范围问题
【发布时间】:2018-09-12 04:35:24
【问题描述】:

这是我被要求解决的问题:

创建一个程序,输入一个短语(如一句名言)并打印所有以 h-z 开头的单词。

我解决了问题,但是前两种方法都不起作用,我想知道原因:

#1 字符串索引超出范围

quote = input("enter a 1 sentence quote, non-alpha separate words: ")
word = ""

for character in quote:
    if character.isalpha():
        word += character.upper()
    else:
        if word[0].lower() >= "h":
            print(word)
            word = ""
        else: 
            word = ""

对于“g”之后的任何单词,我都会收到 IndexError: string index out of range 消息。 else 语句不应该抓住它吗?我不明白为什么不这样做,因为如果我从word[0] 中删除括号[],它就可以工作。

#2:最后一个字不打印

quote = input("enter a 1 sentence quote, non-alpha separate words: ")
word = ""

for character in quote:
    if character.isalpha():
        word += character.upper()
    else:
        if word.lower() >= "h":
            print(word)
            word = ""
        else: 
            word = ""

在这个例子中,它在一定程度上起作用。它消除了“h”之前的任何单词并打印“h”之后的单词,但由于某种原因不打印最后一个单词。我使用什么引号并不重要,即使它在'h'之后,它也不会打印最后一个单词。这是为什么呢?

【问题讨论】:

    标签: python if-statement


    【解决方案1】:

    您正在拨打word[0]。这将访问可迭代字符串word 的第一个元素。如果word为空(即word == ""),则没有“第一个元素”可以访问;因此你得到一个IndexError。如果“单词”以非字母字符(例如数字或破折号)开头,则会发生这种情况。

    您遇到的第二个错误,即您的第二个代码 sn-p 遗漏了最后一个单词,是因为您用于解决此问题的方法。看起来您正在尝试逐个字符地浏览给出的句子,并决定是否在阅读完一个单词后打印它(您知道这是因为您点击了一个空格字符.但这会导致您的第二种方法出现问题,即它不打印最后一个字符串。那是因为句子中的最后一个字符不是空格 - 它只是最后一个单词中的最后一个字母。所以,你的 else 循环永远不会被执行。

    我建议使用完全不同的方法,使用方法string.split()。此方法是 python 内置的,会将一个字符串转换为一个较小的字符串列表,并在您指定的字符/子字符串中拆分。所以如果我这样做了

    quote = "Hello this is a sentence"
    words = quote.split(' ')
    print(words)
    

    你最终会看到这个:

    ['Hello', 'this', 'is', 'a', 'sentence']
    

    在解决此问题的下一个方法中要记住以下几点:

    1. 您需要考虑空词(例如,如果我出于某种原因连续有两个空格),并确保它们不会破坏脚本。
    2. 您需要考虑数字和破折号等非字母数字字符。您可以忽略它们或以不同的方式处理它们,但您必须准备好一些东西。
    3. 您需要确保在某个时候处理最后一个单词,即使句子不以空格字符结尾。

    祝你好运!

    【讨论】:

    • 这很有帮助,尤其是索引错误问题。非常感谢您的回复!我得到了解决问题的具体方法,但我刚刚尝试使用拆分功能解决问题 :) 希望你有愉快的一天
    【解决方案2】:

    您可以迭代字符串中的每个单词并计算其中有多少以这些字母开头,而不是您正在做的事情。阅读有关函数 str.split() 的信息,在参数中输入分隔符,在本例中为 ' ',因为您要计算单词,并返回字符串列表。在循环中迭代它,它应该可以工作。

    【讨论】:

    • 感谢您的回复!我得到了解决问题的具体方法,但我只是听从了你的建议并尝试了拆分方法 :) 效果很好,哈哈,祝你有美好的一天
    猜你喜欢
    • 2016-02-10
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多