我做了一条Python';强盗';s语言';翻译程序,对吗?
所以我只是python中的一个noob,我在做这个练习: “编写一个函数translate(),将文本翻译成“rövarspråket”(瑞典语表示“robber's language”)。也就是说,将每个辅音加倍,并在两个辅音之间加上一个“o”。例如,translate(“this is fun”)应返回字符串“tothohisos isos fofunon”。” 我能做到这是我的代码:我做了一条Python';强盗';s语言';翻译程序,对吗?,python,Python,所以我只是python中的一个noob,我在做这个练习: “编写一个函数translate(),将文本翻译成“rövarspråket”(瑞典语表示“robber's language”)。也就是说,将每个辅音加倍,并在两个辅音之间加上一个“o”。例如,translate(“this is fun”)应返回字符串“tothohisos isos fofunon”。” 我能做到这是我的代码: def translate (var1): vaw = ['b','c','d','f','g',
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)
我想知道这是否正确,或者是否有其他方法可以用更少的代码完成这项工作?首先,您不需要这样做:
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"))
vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
…以获取字符序列。字符串已经是一个字符序列。(对于var1
,情况也是如此,但是在这里,您的代码需要一个可变的字符序列,您可以用更长的字符串替换任何字符,因此您确实需要一个列表
)
另外,您的代码实际上不起作用,因为vaw中的string==string
与vaw中的True相同,后者总是false。我想你的意思是如果vaw中的字符串是。在这里,我不会调用变量string
,因为这是内置模块的名称
而且,在标准Python样式(PEP8)表示不允许的地方,不添加额外的空格,可以节省一些击键次数。:)
因此:
接下来,如果您想在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
列表进行变异,那么这就是您所能做的。您可以将其更改为dovar1[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
即使修复了缩进错误,代码也无法工作string==vaw中的string
相当于vaw中的True,这从来都不是真的。+1,因为解决方案的简单性和优雅性低于正则表达式(我认为)。。。但对所有的人来说+1都是一样的readablity@JoranBeasley字体你真的在乎速度慢吗?而且,如果你这样做了,为什么你会假设没有测试?对于这个小字符串,根据%timeit
,这个版本的正则表达式需要4.72us而不是28.1us(这甚至还包括了额外函数调用的成本)。拿一个128K的HTML文档来说,%timeit
说这个是28.3ms,而re
是125ms。所以,它比正则表达式快5倍。很好-我不会想到这一点one@JoranBeasley:当然,当我解释完的时候,NPE已经比我提前4分钟写出了几乎完全相同的答案哇,谢谢大家,我真的很感激
>>> import re
>>> print re.sub(r"([bcdfghjklmnpqrstvwxyz])",r"\1o\1","this is fun")
tothohisos isos fofunon