2017-02-07 5 views
0

Итак, у меня есть этот проект для школы, и я настолько близок к его завершению, но есть тот, который я просто не могу заставить работать нормально. Одна из функций, которые у меня есть:Python: Письма к номерам не работают правильно

vowels = "aeiou" 
consonants = "bcdfghjklmnpqrstvwyz" 

def alphapinDecode(tone): 
    s = tone.lower() 
    pin = '' 

    for ch in s: 
     if ch in consonants: 
      idx = consonants.find(ch) 
     elif ch in vowels: 
      idx2 = vowels.find(ch) 

      pin = str(pin) + str(idx*5 + idx2) 




    print(pin) 

    return None 

По большей части функция работает именно так, как я ее хочу. Я беру строку и возвращает числа в виде строки.

Например:

>>> alphapinDecode('bomelela') 
3464140 

Но когда я делаю это один:

>>>> alphapinDecode('bomeluco') 

возвращает 346448 вместо 3464408, как предполагается сделать (по моему заданию). Теперь я знаю, что функция дает мне правильный ответ на основе кода, но что мне не хватает, чтобы он включал 0 перед 8?

EDIT:

Функция должна принимать строку, вы передаете (тон) и разбить его на 2-буквенных куски (гласный/согласный пара). С этой парой предполагается использовать пару и индексировать их с гласными/согласными и возвращать число. >>> alphapinDecode («привет») возвращает 27, потому что согласные [ч] дает IDX = 5, а гласные [я] дает idx2 = 2

+3

Это поможет, если вы объяснили, что именно ваша функция должна делать и как. – DyZ

+0

Извините, я думал, что сделал ... но он должен взять строку, которую вы проходите (тон), и разбить ее на 2 куска буквы (гласная/согласная пара). С этой парой предполагается использовать пару и индексировать их с гласными/согласными и возвращать число. >>> alphapinDecode ('hi') возвращает 27, потому что согласные [h] дают idx = 5, тогда как гласные [i] дают idx2 = 2 – user2951723

+0

Пожалуйста, обновите свои вопросы, чтобы другие пользователи знали, что ответить. – DyZ

ответ

0

Ваш подход, возможно, неудобно - я бы итерацию два символа в то время:

def alphapinDecode(tone): 
    s = tone.lower() 
    pin = '' 

    # Step over the string two characters at a time 
    for i in range(0, len(s), 2): 
     ch1 = s[i] 
     ch2 = s[i+1] 
     if ch1 in consonants and ch2 in vowels: 
      idx1 = consonants.find(ch1) 
      idx2 = vowels.find(ch2) 
      this_pair = idx1*5 + idx2 
      # For debugging 
      print(this_pair) 
      pin = pin + str(this_pair) 

    # We need to print without leading zeroes 
    print(int(pin)) 

    # Returning the pin as an integer is better, IMO 
    return int(pin) 

ОК, теперь у нас есть код выглядит немного лучше, мы можем видеть, я надеюсь, что для co пары в вашем втором тексте, значение 1*5 + 3, что соответствует 8, конечно, но вы действительно хотите 08. Существует несколько способов сделать это, но, поскольку вы новичок, я проиллюстрирую самый простой способ.

this_pair = idx1*5 + idx2 
if this_pair < 10: 
    # If the pair is less than ten, prepend a leading zero 
    this_pair_pin = '0' + str(this_pair) 
else 
    this_pair_pin = str(this_pair) 
pin = pin + this_pair_pin 

EDIT: Давайте забудем о накоплении ответа в строке, как мы можем упростить код:

pin = 0 
#... 
     this_pair = idx1*5 + idx2 
     pin = pin * 100 + this_pair 

print(pin) 
+0

Неужели это добавит 0 перед 3, хотя?Итак, он заканчивается 03464408 – user2951723

+0

@ user2951723 Ах, вы правы, и я ошибся в комментарии, который я удалил ... –

1

Я думаю, что ваша лекция пытается проверить студент кодирование приспособляемости. Если действительно хотите достичь какой-то выход, как, что, пожалуйста, попробуйте, как показано ниже

vowels = "aeiou" 
consonants = "bcdfghjklmnpqrstvwyz" 

def alphapinDecode(tone): 
    s = tone.lower() 
    pin = '' 

for ch in s: 
    if ch in consonants: 
     idx = consonants.find(ch) 
    elif ch in vowels: 
     idx2 = vowels.find(ch) 

     num = '%02d' % int((idx*5) + idx2) #python 2 
     num = "{0:0=2d}".format((idx*5) + idx2) #python 3 more verbose 
     pin = pin + str(num) 

    print(int(pin)) 

    return None 

alphapinDecode('bomeluco') # 3464408 

alphapinDecode('bomelela') # 3464140 
+0

Что такое '% 02d'%? – user2951723

+0

@ user2951723 ** '% 02d' ** форматирует целое число 'd' в поле минимальной ширины 2, с нулевым заполнением слева (ведущим), ** второй оператор '%' ** называется [string форматирование] (https://docs.python.org/3/library/stdtypes.html#string-formatting) при использовании со строкой с левой стороны. – Tyler

Смежные вопросы