将字符串翻译为"强盗的语言"

时间:2014-05-13 18:29:54

标签: python string function

我正在尝试为即将到来的实用编程测试练习,所以一直在线浏览示例并遇到了这个

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

我不知道为什么,但我正在努力解决这个问题。这么简单,但我遇到了困难。这是我试过的

def translate(n):
    consonant="bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"
    for letters in n:
        if letters in consonant:
            return (letters+"O"+letters)
        else:
            return("Vowel")

如果我的编码超级业余,我很抱歉。只是想学习:/

6 个答案:

答案 0 :(得分:4)

consonants = set("bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ")
original_string = "this is fun"
translated = ''.join(map(lambda x: x+"0"+x if x in consonants else x,original_string)
print translated

是我可以做到这一点的一种方式...这只是将每个字母映射到字母+ 0 +字母(如果它是辅音)然后加入结果列表

答案 1 :(得分:1)

    mytext = 'thisisfun'
consonants = 'bcdfghjklmnpqrstuvwxyz'
newtext = []
def translate(mytext):
    for i in mytext:
        if i not in consonants:
            newtext.append(i)
        else:
            newtext.append(i)
            newtext.append('o')
            newtext.append(i)
    print(newtext)

translate(mytext)

它现在将结果显示为一个列表,只是为了让它回到一个字符串为你...问你是否有任何疑问,它现在对我有效...还有更多优雅的方式,我现在正在努力 - 你至少给了我10分钟的事情!

答案 2 :(得分:1)

return是函数的结尾。完全停止。你只能归还一件事。所以你需要在循环中累积一些值,然后在最后return。如果您想调整现有代码,我会留给您。

你的思维方式 - 最初返回一个东西,保持状态,然后从那里继续复飞,实际上是生成器的工作方式:

def translate(n):
    consonants = set("bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ")
    for letter in n:
        if letter in consonants:
            yield '{}o{}'.format(letter,letter)
        else:
            yield letter

''.join(translate('this is fun'))
Out[44]: 'tothohisos isos fofunon'

刷了一些东西,但代码的核心就在那里。

所以......是的写完这篇文章之后,我不确定你在回答中寻找什么。如果您正在寻找其他方式来编写它,我可能会这样做:

from string import ascii_letters
def translate(s):
    consonants = set(ascii_letters) - set('aeiouAEIOU')
    def _mapper(c):
        return '{}o{}'.format(c,c) if c in consonants else c
    return ''.join(map(_mapper, s))

答案 3 :(得分:1)

你是在正确的行,但return意味着你只能从函数中获得一个字符。

以下是您的函数的略微修改版本,它在最后构建一个新字符串并return

def translate(n):
    consonants = set("bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ")
    ret_str = ""
    for letter in n:
        if letter in consonants:
            ret_str += letter + ("o" if letter.islower() else "O") + letter
        else:
            ret_str += letter
    return ret_str

我正在使用str.islower()来确定“o”是否应为大写。

一般来说,测试set中的成员资格比测试字符串,列表或其他类型集合中的成员资格要快,所以我已将其包含在上面。然而,这可能被视为过早优化,因为制作一个集合对象可能会花费你大约相同的时间来测试集合中的成员资格将节省...

如果你不关心“o”的情况,你可以改用list comprehension,如下所示:

''.join([ s + "o" + s if s in consonant else s for s in n ])

[ ]中的部分是列表推导,它返回一个列表。然后使用str.join()将列表的元素组合成一个字符串。

如果您还想查看大写或小写,这会有点麻烦:

''.join([ s+"o"+s if s.islower() else s+"O"+s if s in consonant else s for s in n ])

答案 4 :(得分:1)

我对python的了解非常简短,但我认为作者忘了写一个空字符串,并且在for循环后添加到字母......

def traslate():
  a = raw_input("Please give a sentence: ")
  b = ""
  for i in a:
     b += i
     if i in "bcdfghjklmnpqrstvwxyz":
           b += "o" + i
  print "You answer translate into 'robber' language: " + b

traslate(n)

也许你喜欢这个....

def translate(n):
    b = ""
    consonant = "bcdfghjklmnpqrstvwxyz"
    for letters in n: 
          b += letters           # you add first time the consonant
          if letters in consonant:
                b += "0" + letters  #you add 0 and seconds consonant
          else:
              return ("Vowel")

print translate ("this is funk")

答案 5 :(得分:-1)

consonants = 'bcdfghjklmnpqrstuvwxyz'
def translate(mytext):
    newtext = ""
    for i in mytext:
        if i in consonants:
            newtext+=i+'o'+i                
        else:
            newtext+=i
    return newtext
#Enter any text by using mytext variable
mytext = input("Enter Text")
translatedText=translate(mytext)
print("After translation the text is:",translatedText)