0

所以我只是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)

我想知道这是否正确,或者是否有另一种方法可以用更少的代码来做到这一点?

4

3 回答 3

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"))
于 2013-03-13T21:25:44.673 回答
5

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

>>> import re
>>> print re.sub(r"([bcdfghjklmnpqrstvwxyz])",r"\1o\1","this is fun")
tothohisos isos fofunon
于 2013-03-13T21:32:16.323 回答
1

首先,您不需要这样做:

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就地改变列表,这大约是您可以做到的。您可以将其更改为 do var1[i+1:i+1] = 'o' + s,在现有元素之后插入新元素,但随后您必须迭代副本var1(在迭代时不能更改任何东西的形状),并且您必须跟踪你的索引是如何变化的,等等。

建立一个新结构通常比修改旧结构要简单得多。这就是列表推导、生成器表达式、mapfilter等的用途。对于原始列表的每个元素s,你想要s + 'o' + s它是否在 中vaws否则,对吗?你可以把它翻译成 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)
于 2013-03-13T21:29:34.800 回答