2009-10-13 6 views
2

Бюро переписи США использует специальную кодировку под названием «soundex» для поиска информации о человеке. Soundex - это кодировка фамилий (фамилий), основанных на том, как звучит фамилия, а не как она написана. Фамилии, которые звучат одинаково, но различаются по-разному, например SMITH и SMYTH, имеют одинаковый код и подаются вместе. Система кодирования soundex была разработана так, что вы можете найти фамилию, даже если она, возможно, была записана под различными написаниями.Может использовать некоторую помощь в этом кодировании soundex

В этой лаборатории вы будете проектировать, кодировать и документировать программу, которая создает код soundex при вводе с фамилией. Пользователю будет предложено указать фамилию, и программа должна вывести соответствующий код.

Основные SOUNDEX Coding Правила

Каждый Саундэкс кодирования фамилии состоит из буквы и трех цифр. Используемое письмо всегда является первой буквой фамилии. Номера присваиваются остальным буквам фамилии в соответствии с приведенным ниже руководством soundex. Нулевые значения добавляются в конце, если необходимо, чтобы всегда создавать четырехсимвольный код. Дополнительные буквы не учитываются.

Саундэкс Coding Руководство

Саундэкс назначает номер для различных согласных. Согласные, которые звучат одинаково назначены один и тот же номер:

Номер Согласные

1 В, F, P, V 2 С, G, J, K, Q, S, X, Z 3 D, T 4 л 5 M, N 6 R

Саундэкс игнорирует буквы A, E, I, O, U, H, W и Y.

Есть 3 дополнительных Саундэкс правила кодирования, которые следуют , Хороший дизайн программы будет реализовывать их как одну или несколько отдельных функций.

Правила 1. Имена с двойным Letters

Если фамилия имеет какие-либо двойные буквы, они должны рассматриваться в качестве одной буквы. Например:

  • Gutierrez кодируется G362 (G, 3 для T, 6 для первого R, второй R игнорируется, 2 для Z).

Правило 2. Имена с Letters Бок о Бок, которые имеют одинаковый номер Саундэкс Код

Если фамилия имеет разные буквы бок о бок, которые имеют тот же номер в руководстве кодирования Саундэкс, их следует рассматривать как одну букву. Примеры:

  • Пфистер кодируется как P236 (P, F игнорируется, так как считается, так же, как Р, 2 для S, 3 для Т, 6 для R).

  • Jackson кодируется как J250 (J, 2 для C, K игнорируется так же, как C, S игнорируется так же, как C, 5 для добавления N, 0).

Правило 3. Согласные Сепараторы

3.a.Если гласный (A, E, I, O, U) разделяет два согласных, которые имеют один и тот же код soundex, закодирован согласный справа от гласного. Пример:

  • Tymczak кодируется как Т-522 (Т, 5 для M, 2 для C, Z игнорируются (см "бок-о-Side" правила выше), 2 для K). Поскольку гласный «A» разделяет Z и K, кодируется K.

3.b. Если «H» или «W» разделяют два согласных, которые имеют одинаковый код soundex, согласный справа не закодирован. Пример:

* Ashcraft кодируется A261 (A, 2 для S, C игнорируется с тех пор, как S с H между ними, 6 для R, 1 для F). Он не закодирован A226.

До сих пор это мой код:

surname = raw_input("Please enter surname:") 
outstring = "" 

outstring = outstring + surname[0] 
for i in range (1, len(surname)): 
    nextletter = surname[i] 
    if nextletter in ['B','F','P','V']: 
     outstring = outstring + '1' 

    elif nextletter in ['C','G','J','K','Q','S','X','Z']: 
     outstring = outstring + '2' 

    elif nextletter in ['D','T']: 
     outstring = outstring + '3' 

    elif nextletter in ['L']: 
     outstring = outstring + '4' 

    elif nextletter in ['M','N']: 
     outstring = outstring + '5' 

    elif nextletter in ['R']: 
     outstring = outstring + '6' 

print outstring 

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

+0

freakin полезно! – Matias

+0

http://code.activestate.com/recipes/52213/ – Peter

+0

Обратите внимание, что домашнее задание говорит, что хороший дизайн будет использовать функции. Этот рецепт не получил бы хорошего качества в этой конкретной домашней работе ... :-) Тем не менее, этот рецепт, по-видимому, возвращает правильные ответы и может быть полезен для проверки правильности кода домашней работы. – steveha

ответ

0

Несколько подсказок:

  • Используя массив, где каждый код Саундэкса хранится и индексируется значением ASCII (или значение в более коротком числовом диапазоне, полученный их) писем она соответствует, вы оба сделаете код более эффективным и понятным. Это очень распространенный метод: понимать, использование и повторное использование ;-)

  • Как разобрать строку ввода, вам нужно следить (или сравнить с) письмо предварительно обработаны, чтобы игнорировать повторяющиеся буквы, и ручка другие правила. (реализовать каждую из них в отдельной функции, как намечено в записи). Идея могла заключаться в том, чтобы ввести функцию, отвечающую за - возможно - добавление кода soundex для текущей буквы обрабатываемого ввода. Эта функция, в свою очередь, вызовет каждую из функций «правил», возможно, отбросив раннее, основываясь на возвращаемых значениях некоторых правил. Другими словами, заменить систематическая ...

 
    outstring = outstring + c # btw could be += 
...with 
    outstring += AppendCodeIfNeeded(c) 
  • нужно учитывать, что это многофункциональная структура избыточна для такой тривиальной логики, но это не плохая идея, чтобы сделать это на практике.
0

Вот несколько небольших намеков на общий материал Python.

0) Вы можете использовать цикл for для петли над любой последовательностью, а строка считается последовательностью. Таким образом, вы можете написать:

for nextletter in surname[1:]: 
    # do stuff 

Это легче писать и легче понять, чем вычислять индекс и индексировать фамилию.

1) Вы можете использовать оператор += для добавления строк.Вместо

x = x + 'a' 

вы можете написать

x += 'a' 

Как помочь с вашей конкретной проблемы, вы хотите, чтобы следить за предыдущее письмо. Если ваше задание было правило, что сказал «два„Z“символов в строке должны быть закодированы как 99», вы можете добавить код, как это:

def rule_two_z(prevletter, curletter): 
    if prevletter.lower() == 'z' and curletter.lower() == 'z': 
     return 99 
    else: 
     return -1 


prevletter = surname[0] 
for curletter in surname[1:]: 
    code = rule_two_z(prevletter, curletter) 
    if code < 0: 
     # do something else here 
    outstring += str(code) 
    prevletter = curletter 

Ммм, вы пишете код для возврата строки целых чисел, как '3' , в то время как я написал свой код, чтобы вернуть фактическое целое число, а затем называть его str(), прежде чем добавлять его в строку. В любом случае, возможно, это хорошо.

Удачи вам!

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

  • Нет связанных вопросов^_^