2014-12-03 52 views
-2

我目前正在为我的Python类做一个程序。描述在这里:字符串切片按预期工作

编写一个简短的python程序YI_swapOandE.py,用'e'替换'o'。提示用户输入一个单词并显示它的交换版本(如果它包含o)。否则,程序将只显示原始单词。这个程序必须使用你在Hangman程序中学到的切片技术。 实例: 键入单词,我会用一个“e”替换任何“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() 

是的我明白,有些位并不完美,但我只需要一点帮助。

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

我该如何解决这个问题?

+0

'letter [:i] + word [i] + letter [i + 1:]'看起来像是在一封信的中间粘贴一个单词,而不是反过来。 – 2014-12-03 21:20:48

+0

'word = word [:i] +'e'+ word [i + 1:]' – 2014-12-03 21:22:34

+2

您将获得今日最少发言题的标题;-) – Alfe 2014-12-03 21:31:33

回答

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() 
+1

OP没有在字符串上循环。因为我在范围内(len(word))循环遍历整数列表。 – munk 2014-12-03 21:20:33

+0

纠正我,我错了吗? – Hackaholic 2014-12-03 21:25:30

+0

你正在讨论修改你正在循环的东西,而这只是在这段代码中没有发生。 – munk 2014-12-03 21:27:57

0

您定义letter是单个字符:

letter = word[i] 

但然后在这一行:

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

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

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()  
+0

谢谢!这工作 – 2014-12-03 21:26:41

+0

嗨@StephendeRiel如果这个或任何答案已解决您的问题,请考虑[接受它](http://meta.stackexchange.com/q/5234/179419)通过点击复选标记。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 – munk 2014-12-03 21:29:52

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'] 

这是非常具有可读性,不是吗?

现在let'g更进一步,改变它的资本“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()方法---在这里,我们想用空字符串""

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

加盟l元素如果我们想要把它放在一起

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