2014-05-13 2 views
4

Я пытаюсь практиковать для моего предстоящего испытания практического программирования так было просматриваемой онлайн примеров и наткнулся на этотПереводя строку «язык грабителя»

«Напишите функцию перевода(), который будет переводить текст в «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") 

Прошу прощения, если мое кодирование является супер-любителем. Просто пытаюсь узнать:/

+4

Вы используете 'return' для выхода из функции, когда вы должны добавлять буквы в новую строку. –

+0

Вы хотите, чтобы случай «O» был таким же, как согласный? –

+2

'. '.join ([x +' O '+ x, если x в согласных else x для x в n])' –

ответ

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 + письмо, если его согласной, а затем присоединяется полученные списки

+2

код хардкора для новичка, но умный – nicolallias

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 минут!

+0

аналогичный ответ: http://codepad.org/iDzP1jcG – nicolallias

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)) 
+0

Don Вы имеете в виду согласные вместо гласных? –

+0

У да. Хе-хе. – roippi

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(), чтобы определить, является ли «о» должна быть в верхнем регистре, или нет.

В целом тестирование на членство в set происходит быстрее, чем тестирование на членство в строках, списках или других типах коллекций, поэтому я включил это выше. Это можно рассматривать как преждевременную оптимизацию, так как создание заданного объекта, вероятно, будет стоить вам столько же времени, сколько и тестирование на членство в наборе сэкономит ...

Если вы не обеспокоены случае «о», вы могли бы использовать вместо 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 ]) 
-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) 
+1

Хотя этот код может помочь решить проблему, , предоставляя дополнительный контекст относительно _why_ и/или _how_ it , ответ на вопрос значительно улучшит его долгосрочную стоимость . Пожалуйста, отредактируйте свой ответ, чтобы добавить описание . –

1

мои знания о питоне очень короткие, но я думаю, что автор уже забыл написать пустая строка, и это дополнение к буквам, после того, как цикл ...

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") 
Смежные вопросы