我做了一个Python的“抢匪语言”翻译程序,它正确吗?
我刚开始学Python,正在做一个练习:
“写一个叫translate()的函数,它可以把文本翻译成‘rövarspråket’(瑞典语的‘盗贼语言’)。也就是说,要把每个辅音字母都重复一遍,并在中间加一个‘o’。比如,translate("this is fun")应该返回字符串“tothohisos isos fofunon”。”
我完成了这个任务,下面是我的代码:
def translate (var1):
vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
var1 = list(var1)
for string in var1:
if string == string in vaw:
var1[var1.index(string)] = string + 'o' + string
print ''.join(var1)
我在想这样做是否正确,或者有没有其他更简洁的写法呢?
3 个回答
首先,你不需要这样做:
vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
……来获取一串字符。字符串本身就是一串字符。(var1
也是这样,但在这里,你的代码需要一个可以改变的字符序列,这样你才能用更长的字符串替换掉某个字符,所以你确实需要一个list
。)
而且,你的代码实际上是不能工作的,因为string == string in vaw
和True in vaw
是一样的,这个表达式总是返回假。我想你是想写if string in vaw
。顺便说一下,我不建议把变量命名为string
,因为这是一个内置模块的名字。
另外,你可以通过不在标准Python风格(PEP8)不建议的地方添加多余的空格来节省一些输入的时间。:)
所以:
def translate(var1):
vaw = 'bcdfghjklmnpqrstvwxz'
var1 = list(var1)
for s in var1:
if s in vaw:
var1[var1.index(s)] = s + 'o' + s
print ''.join(var1)
接下来,如果你想要var1
中每个元素的索引,你不应该把它丢掉,然后再用index
找回来。这样不仅代码更多,速度也更慢,而且对于任何出现多次的元素,它还会给你错误的答案。所以:
def translate(var1):
vaw = 'bcdfghjklmnpqrstvwxz'
var1 = list(var1)
for i, s in enumerate(var1):
if s in vaw:
var1[i] = s + 'o' + s
print ''.join(var1)
如果你想在原地修改var
列表,这大概是你能做到的极限。你可以把它改成var1[i+1:i+1] = 'o' + s
,这样可以在现有元素后面插入新元素,但这样你就得遍历var1
的一个副本(在遍历时不能改变任何东西的形状),还得跟踪你的索引是如何变化的,等等。
通常,构建一个新的结构比在原地修改旧的结构要简单得多。这就是列表推导式、生成器表达式、map
、filter
等存在的原因。对于原始列表中的每个元素s
,如果它在vaw
中,你想要s + 'o' + s
,否则就只要s
,对吧?你可以直接把这个翻译成Python:
def translate (var1):
vaw = 'bcdfghjklmnpqrstvwxz'
new_var1 = (s + 'o' + s if s in vaw else s for s in var1)
return ''.join(new_var1)
正则表达式是一种很好的解决方案
>>> import re
>>> print re.sub(r"([bcdfghjklmnpqrstvwxyz])",r"\1o\1","this is fun")
tothohisos isos fofunon
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个库或者框架的时候,遇到了一些错误或者不明白的地方。这时候,查看其他人的提问和回答就非常有帮助了。
在StackOverflow上,很多人会分享他们遇到的问题和解决方案。通过这些讨论,我们可以学习到很多实用的技巧和知识,帮助我们更好地理解编程的世界。
如果你在编程的过程中遇到困难,不妨去看看这些讨论,或许能找到你需要的答案或者灵感。
def translate(s):
consonants = 'bcdfghjklmnpqrstvwxz'
return ''.join(l + 'o' + l if l in consonants else l for l in s)
print(translate("this is fun"))