0

所以我在下面有这个函数,我想返回一个新字符串,其中每个 ch 都替换为 ch2:

def replace(s, ch, ch2):
'''(str, str, str) - > str
Return a new string where every instance of ch in s is replaced with ch2
Precondition: len(ch) == 1 and len(ch2) == 1
'''

i = 0
m = s[i]
while i < len(s):
    if s[i] == ch:
        return ch2
    m = m + s[i]
    i += 1
return m

当我输入这个:

replace('razzmatazz', 'z', 'r')

我希望输出是这样的:

'rarrmatarr'

我尝试了几种方法,但我只得到'r' or 'rr'.

有人能告诉我哪里出错了吗?

4

5 回答 5

2

ch2一旦您在原始字符串中找到,您就会从函数中返回ch,因此无法按照您期望的方式工作。您必须将正确的字符添加到新字符串中,然后在遍历原始字符串中的每个字符后返回该字符串。

i = 0
m = ''
while i < len(s):
    m += ch2 if s[i] == ch else s[i]
    i += 1

return m

此外,正如其他答案中所指出的,有更好的方法来实现这一点。

于 2013-06-16T19:32:31.483 回答
1

我认为你的代码应该是。

i = 0
m = s[i]
while i < len(s):
    if s[i] == ch:
        m = m + ch2 // Here you are lagging.
     else   
        m = m + s[i]
    i += 1
return m

因为,在您的代码中,当在字符串中razzmatazzif firstz匹配 then 而不是替换时,它返回ch2ie r。因此你得到r.

于 2013-06-16T19:21:35.087 回答
0

为什么不使用 Python 中可用的 str.replace()?

>>> s = 'razzmatazz'
>>> s.replace('z', 'r')
'rarrmatarr'

无需创建自定义函数即可完成您想要的操作

于 2013-06-16T19:19:17.373 回答
0

这是语言内置的

'razzmatazz'.replace('z', 'r')

'rarrmatarr'

如果我会使用你的风格,我会写更多的东西:

def replace(s, ch, ch2):
    s2 = list(s)
    i=0
    while i < len(s):
        if s2[i] == ch:
            s2[i]=ch2
        i=i+1
    return "".join(s2)
于 2013-06-16T19:19:44.187 回答
0

return立即返回一个值并退出函数,即使它处于循环中。您可能想摆脱该while循环并改用一个不错的for循环:

def replace(s, ch, ch2):
    '''(str, str, str) - > str
    Return a new string where every instance of ch in s is replaced with ch2
    Precondition: len(ch) == 1 and len(ch2) == 1
    '''

    result = ''

    for char in s:
        if char == ch:
            result += ch2
        else:
            result += char

    return result

虽然如果你只使用内置str.replace方法会更好:

def replace(s, ch, ch2):
    return s.replace(ch, ch2)

或更简洁地说:

replace = str.replace
于 2013-06-16T19:21:14.307 回答