使用Python改变字母

问题描述 投票:0回答:7

问题陈述:

让函数LetterChanges(str)获取传递的str参数并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。然后大写这个新字符串(a,e,i,o,u)中的每个元音,最后返回这个修改后的字符串。

我的Python程序是:

def LetterChanges(str):
    for i in range(0,len(str)):
        a=ord(str[i])
        if a==122:
            str=str.replace(str[i],'a',1)
        elif a==90:
            str=str.replace(str[i],'a',1)
        elif (a>=65 and a<=90) or (a>=97 and a<=122):
            a=a+1
            char=chr(a)
            str=str.replace(str[i],char,1)
    for i in range(0,len(str)):
        if str[i]=='a':
            str=str.replace(str[i],'A',1)
        elif str[i]=='e':
            str=str.replace(str[i],'E',1)
        elif str[i]=='i':
            str=str.replace(str[i],'I',1)
        elif str[i]=='o':
            str=str.replace(str[i],'O',1)
        elif str[i]=='u':
            str=str.replace(str[i],'U',1)
    return(str)

print LetterChanges(raw_input())

我的代码的问题是,当我输入sen时,输出是tfo,这是正确的。

但是当我把sent作为我的输入时,我得到了错误的输出。

python
7个回答
2
投票

这是另一个尝试:

def prgrm(n):
    k = ""
    for i in n:
        nxt = chr(97 if i == 'z' else ord(i)+1)
        if nxt in ('a', 'e', 'i', 'o', 'u'):
            nxt = nxt.capitalize()
        k += nxt
    print(k)

prgrm('sen')

1
投票

你的错误就在这里:silpa当你替换你时你并不关心字符正在替换的索引,所以当你在替换n之后给sent输入时它会如何发展我们现在在下一个迭代中获得字符串tfot你在原始字符串中遇到的下一个字母是t所以它将取代替换字符串中的第一个字母t所以。 “tfot”变成“ufot”,最后一个没有被替换


1
投票

在不使用ord()或循环的情况下,函数式编程将使用其他非字母字符,我认为:

def LetterChanges(str):
    vowels = "aeiou"
    lowers = "abcdefghijklmnopqrstuvwxyza"
    all = lowers.upper() + lowers
    # Map all alphabetical characters
    nxt_str = "".join(map(lambda x: all[all.index(x) + 1] if x in all else x, str))
    # Map the vowels
    return "".join(map(lambda x: x.upper() if x in vowels else x, nxt_str))

print(LetterChanges("sentdZ"))
tfOUEA

0
投票

您在字符串中处理't'两次,首先将s替换为't',然后再将't'替换为'u',也是字符串中的第一个替换

def LetterChanges(line): 
    result = ""
    for i in line:
        a=ord(i)
        if a == 122 or a == 90:
            result += 'A'
        elif (a >= 65 and a <= 90) or (a >= 97 and a <= 122):
            a = a + 1
            char = chr(a)
            if char in ('e', 'i', 'o', 'u'):
                char = char.upper()
            result += char
        else:
            result += i
    return(result)

0
投票

以下是使用re的另一种方法:

import re

def letter_changes(my_string):
    in_letters = "abcdefghijklmnopqrstuvxyz"
    out_letters = "bcdefghijklmnopqrstuvxyza"

    letter_dict1 = {x:y for x,y in zip(in_letters, out_letters)}
    letter_dict2 = {'a':'A', 'e':'E', 'i':'I', 'o':'O', 'u':'U'}

    for l_dict in [letter_dict1, letter_dict2]:
        pattern = re.compile("|".join(l_dict.keys()))
        my_string = pattern.sub(lambda m: l_dict[re.escape(m.group(0))], my_string)

    return my_string

0
投票

这是编写代码的另一种方法: -

def rep_cap(sent):

    sent_rp = ''.join([chr(c) for c in [x+1 for x in [ord(c) for c in sent]]]).replace('{','a') #This thing is done to convert a to b .... z to a 

    final_output = ""

    vowels = ['a','e','i','o','u']
    for i in sent_rp:
        if i in vowels:
            final_output = final_output+i.upper() #convert vowels to upper case
        else :
            final_output = final_output+i

    return final_output   

sent = raw_input("Enter a sentence:")

print rep_cap(sent)

0
投票

str=str.replace(str[i],char,1)替换此行str = str[:i] + char + str[i+1:] @ Pankaj78691回答此问题的原因是正确的!!

© www.soinside.com 2019 - 2024. All rights reserved.