我做了一条Python';强盗';s语言';翻译程序,对吗?

我做了一条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',

所以我只是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','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
列表进行变异,那么这就是您所能做的。您可以将其更改为do
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

即使修复了缩进错误,代码也无法工作
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