字符串切片无法按预期工作

时间:2014-12-03 21:16:09

标签: python python-3.x

我目前正在为我的Python课程做一个程序。描述如下:

编写一个简短的python程序,YI_swapOandE.py用'e'替换'o'。如果用户包含o,则提示用户输入单词并显示其交换版本。否则,程序将只显示原始单词。该程序必须使用您在Hangman程序中学习的切片技术。 例: 输入一个单词,我将替换任何' o'和扫帚一起扫帚 交换的单词是:breem

到目前为止,在她告诉我们重新使用一些代码之后,我做到了这一点:

def splicing():
    word = input("Please input a word")
    for i in range(len(word)):
        letter = word[i]
        if letter == 'o':
            word = letter[:i] + word[i] + letter[i+1:]
    print(word)


def main():
    splicing()


main()
是的,我知道有些不完美但我只需要一点帮助。

目前,我收到错误:字符串索引超出范围

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

问题在于letter = word[i]。我觉得你很困惑。

你会继续把它视为一个包含多个字符的字符串。

def splicing():
    word = input("Please input a word")
    for i in range(len(word)):
        letter = word[i]
        if letter == 'o':
            word = word[:i] + 'e' + word[i+1:]
    print(word)


def main():
    splicing()


main()    

答案 1 :(得分:1)

您的代码

def splicing():
    word = input("Please input a word")
    for i in range(len(word)):
        letter = word[i]
        if letter == 'o':
            word = letter[:i] + word[i] + letter[i+1:]
    print(word)

让我们看看

        letter = word[i]
        if letter == 'o':

可以简化为

        if word[i] == 'o':

现在,让我们来看看当你找到'o'

时你会做什么
            word = letter[:i] + word[i] + letter[i+1:]

使用您之前使用的letter

            word = word[i] + word[i] + word[i]

这不是你想要的,首先是因为你没有在你的词中加上'e'......

            word = word[:i]+'e'+word[1+1:]

总结

def splicing():
    word = input("Please input a word")
    for i in range(len(word)):
        if word[i] == 'o':
            word = word[:i]+'e'+word[i+1:]
    print(word)

上述过程适用于您当前的级别,但它效率不高,因为您一次又一次地构建了一个名为word的字符串......将字符串转换为数据的效率要高得多可以就地改变的结构,操作替换并转换回字符串

>>> word = 'Popeye & Olive'
>>> l = [c for c in word]
>>> print(l)
['P', 'o', 'p', 'e', 'y', 'e', ' ', '&', ' ', 'O', 'l', 'i', 'v', 'e']

现在,您可以在构建新数据结构时应用修改:

>>> l = ['e' if c == 'o' else c for c in word]
>>> print(l)
['P', 'e', 'p', 'e', 'y', 'e', ' ', '&', ' ', 'O', 'l', 'i', 'v', 'e']

它非常易读,不是吗?

现在让我们更进一步,改变首都'O'

>>> l = ['e' if c == 'o' else 'E' if c == 'O' else c for c in word]

它有点复杂但仍然可读......

>>> print(l)
['P', 'e', 'p', 'e', 'y', 'e', ' ', '&', ' ', 'E', 'l', 'i', 'v', 'e']

但这不是我们想要的,我们想要一个字符串!

为此目的,python提供了str.join()方法---这里我们要使用空字符串l加入""的元素

>>> print("".join(l))
Pepeye & Elive
>>> 

如果我们想把它们放在一起

>>> word = "".join(['e' if c=='o' else 'E' if c=='O' else c for c in word])
>>> print(word)
Pepeye & Elive
>>> 

答案 2 :(得分:0)

replace可以做你想要达到的目标:

>>> "hello how are you".replace('o','e')
'helle hew are yeu'
>>> "broom".replace('o','e')
'breem'

对您的代码进行一些修改:

def splicing():      
    word = input("Please input a word")
    modify = ''
    for i in range(len(word)):
        if word[i] == 'o':
            modify += 'e'
        else: modify += word[i]
    print(modify)

def main():
    splicing()

main()

答案 3 :(得分:0)

您将letter定义为单个字符:

letter = word[i]

然后在这一行:

word = letter[:i] + word[i] + letter[i+1:]

......你正在切片。这就是错误的原因。使用letter更改该行中word的两个引用可能就是您要尝试的内容,但您还需要将一个引用更改为word在那里。 (提示:因为当你看到'o'时你只是碰到了这个区域的内部,你确切地知道你想要去那里。不需要变量。)