我制作了一个Python'强盗语言'翻译程序,这是正确的吗?

时间:2013-03-13 21:22:37

标签: python

所以我只是python中的一个菜鸟,我正在做这个练习:

  

“编写一个函数translate(),将文本转换为”rövarspråket“(瑞典语为”强盗的语言“)。也就是说,每个辅音加倍并在其间放置”o“。例如,翻译( “这很有趣”)应该返回字符串“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 个答案:

答案 0 :(得分:9)

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"))

答案 1 :(得分:5)

正则表达式是一个很好的解决方案

>>> import re
>>> print re.sub(r"([bcdfghjklmnpqrstvwxyz])",r"\1o\1","this is fun")
tothohisos isos fofunon

答案 2 :(得分:1)

首先,您不需要这样做:

vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']

...获取一系列字符。字符串已经是一系列字符。 (对于var1也是如此,但在那里,你的代码需要一个可变字符序列,你可以用更长的字符串替换任何字符,所以你做< / em>需要一个list。)

此外,您的代码实际上无法正常工作,因为string == string in vawTrue in vaw相同,但始终为false。我想你的意思是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的副本(在迭代时不能更改任何形状)它),你必须跟踪你的索引如何移动,等等。

构建新结构通常要比修改旧结构简单得多。这就是列表推导,生成器表达式,mapfilter等等。对于原始列表的每个元素s,如果它位于s + 'o' + s,则需要vaw,否则只需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)