该程序的目标是加密字符串。规则是字符串中的每个元音都应该在原始元素之后交换到第三个元音。如果元音超出长度,则返回第一个并继续计数。至于辅音,它与第一条规则类似,不同之处在于它将在原始辅音之后换成第二辅音。如果有空格,请将其留空。
我遇到了一个问题,即字符串索引超出范围,我找不到问题所在。此外,在text [x]无法再找到任何元素之后,程序是否能够自动转义循环?
empty=''
UA="AEIOU"
UC="BCDFGHJKLMNPQRSTVWXYZ"
text=str(input())
Flag=True
x=0
while Flag:
if ord(text[x])==32:
r=' '
empty=empty+r
elif 41<=ord(text[x])<=90:
if (ord(text[x])==65 and ord(text[x])==69 and ord(text[x])==73 and ord(text[x])==79 and ord(text[x])==85):
r=0
while (ord(text[x])!=ord(UA[r])):
r=r+1
if r+3>=len(UA):
r=r-2
else:
r=r+3
empty=empty+UA[r]
x=x+1
else:
r=0
while (ord(text[x])!=ord(UC[r])):
r=r+1
if r+2>=len(UC):
r=r-19
else:
r=r+2
empty=empty+UC[r]
x=x+1
elif ord(text[x])==None:
Flag=False
print(empty)
虽然Achilleas的第二个解决方案非常好,但我想建议一个小扩展。您可以使用string.maketrans()
和string.translate()
来执行相同的操作(可能更高效),而不是生成查找字典:
# as suggested by Achilleas, define a second string by rotating the original:
vowels = "aeiou"
shifted_vowels = vowels[2:]+vowels[:2]
# create a translation table
import string
t = string.maketrans(vowels, shifted_vowels)
# apply translation table
>>> text = "i am text that is going to be altered"
>>> string.translate(text, t)
'u im toxt thit us gaung ta bo iltorod'
# or equivalently
>>> text.translate(t)
'u im toxt thit us gaung ta bo iltorod'
看,马,没有(显式)循环!
我认为使用所有for循环和所有if子句调试此代码非常令人困惑。这就是为什么你应该尽可能地在python中尽量避免它们。
解决此问题的一种好方法是使用词典来映射翻译。例如,对于元音,您可以使用以下元音
vowels = {"a": "i", "e": "o", "i": "u", "o": "a", "u": "e"}
然后,您可以使用map函数将所需文本的字母映射到相应的新值
text = "i am text that is going to be altered"
text = map(lambda x: vowels[x] if x in "aeiou" else x, text)
print("".join(text))
上面的代码所做的是将每个元音x改为新值。 Map返回一个列表,所以最后你必须把它加入一个字符串。
此方法的缺点是您必须为所有字母指定每个值对,但这也是您可以使用新函数进行的操作并减少代码中的失败点。这样,您就不会将单词的翻译与正确翻译的产生混合在一起,从而使其更易于阅读和调试
编辑:一种很好的映射方法是将所有元音的字符串移动N个空格并创建映射字典,例如:
vowels_translation = {}
vowels = "aeiou"
shifted_vowels = vowels[2:]+vowels[:2]
for k,v in zip(vowels,shifted_vowels):
vowels_translation[k] = v
你可以试试这个:
from string import ascii_lowercase as l
cons = filter(lambda x:x not in 'aeiou', l)
vs = 'aeiou'
text = "i am text that is going to be altered"
final_text = ''.join([i if i == ' ' else (lambda x:cons[cons.index(x)+2] if cons.index(x)+2 < len(cons) else 'b')(i) if i in cons else (lambda x:vs[vs.index(x)+3] if vs.index(x)+3 < len(vs) else 'a')(i) for i in text])
输出:
'a op wuzw wkow av jaaqj wa du onwutug'