2

米国国勢調査局は、「soundex」と呼ばれる特別なエンコードを使用して、個人に関する情報を見つけます。soundex は、姓の綴りではなく、発音に基づいた姓 (姓) のエンコーディングです。SMITH と SMYTH のように、同じように聞こえるが綴りが異なる姓は、同じコードを持ち、一緒にファイルされます。soundex コーディング システムは、姓がさまざまな綴りで記録されている場合でも姓を見つけることができるように開発されました。

このラボでは、姓を入力すると soundex コードを生成するプログラムを設計、コーディング、および文書化します。ユーザーは姓の入力を求められ、プログラムは対応するコードを出力する必要があります。

基本的な Soundex コーディング規則

姓のすべての soundex エンコーディングは、文字と 3 つの数字で構成されます。使用される文字は常に姓の最初の文字です。以下に示すsoundexガイドに従って、姓の残りの文字に番号が割り当てられます。常に 4 文字のコードを生成するために、必要に応じて末尾にゼロが追加されます。追加の文字は無視されます。

Soundexコーディングガイド

Soundex は、さまざまな子音に番号を割り当てます。同じように聞こえる子音には同じ番号が割り当てられます。

数子音

1 B、F、P、V 2 C、G、J、K、Q、S、X、Z 3 D、T 4 L 5 M、N 6 R

Soundex は、文字 A、E、I、O、U、H、W、および Y を無視します。

従うべき 3 つの追加の Soundex コーディング規則があります。優れたプログラム設計では、これらをそれぞれ 1 つ以上の個別の関数として実装します。

ルール 1. 2 文字の名前

姓に二重文字が含まれている場合は、それらを 1 文字として扱う必要があります。例えば:

  • Gutierrez は G362 にコード化されています (G、T は 3、最初の R は 6、2 番目の R は無視、Z は 2)。

ルール 2. 同じ Soundex コード番号を持つ文字が並んでいる名前

姓に異なる文字が並んでいて、soundex コーディング ガイドでは同じ数字になっている場合、それらは 1 つの文字として扱われるべきです。例:

  • Pfister は P236 としてコード化されます (P、F は P と同じと見なされるため無視されます。S は 2、T は 3、R は 6)。

  • Jackson は J250 としてコード化されます (J、C は 2、K は C と同じように無視され、S は C と同じように無視され、N は 5、0 が追加されます)。

ルール 3. 子音区切り

3.a. 母音 (A、E、I、O、U) が同じ soundex コードを持つ 2 つの子音を区切る場合、母音の右側の子音がコード化されます。例:

  • Tymczak は T-522 としてコード化されています (T、M の場合は 5、C の場合は 2、Z は無視されます (上記の「Side-by-Side」ルールを参照)、K の場合は 2)。母音「A」はZとKを分離するため、Kがコード化されます。

3.b. 「H」または「W」が同じ soundex コードを持つ 2 つの子音を区切る場合、右側の子音はコード化されません。例:

*Ashcraft は A261 とコード化されています (A、S は 2、C は S と同じで無視され、その間に H があり、R は 6、F は 1)。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

コードは要求されたことを十分に実行しますが、3 つのルールをコーディングする方法がわかりません。それが私が助けを必要としているところです。だから、どんな助けも大歓迎です。

4

2 に答える 2

0

いくつかのヒント:

  • 各 Soundex コードが格納され、対応する文字の ASCII 値 (またはそれから派生した短い数値範囲の値) によってインデックス付けされる配列を使用することにより、コードを効率的かつ読みやすくします。これは非常に一般的な手法です: 理解し、使用し、再利用してください ;-)

  • 入力文字列を解析するとき、以前に処理された文字を追跡 (または比較) して、繰り返し文字を無視し、他のルールを処理する必要があります。(記事で示唆されているように、これらのそれぞれを個別の関数で実装します)。アイデアは、処理されている入力の現在の文字のsoundexコードを追加することを担当する関数を導入することである可能性があります。この関数は、各「ルール」関数を順番に呼び出し、いくつかのルールの戻り値に基づいて早期に終了する可能性があります。つまり、体系的なものを置き換えます...

    outstring = outstring + c # ところで、+= の可能性があります
...と
    outstring += AppendCodeIfNeeded(c)
  • この多機能構造は、そのような些細なロジックには過剰であることに注意してください。しかし、練習のためにそれを行うことは悪い考えではありません。
于 2009-10-13T19:41:01.423 に答える
0

ここでは、一般的な Python に関するヒントをいくつか紹介します。

0) for ループを使用して任意のシーケンスをループすることができ、文字列はシーケンスとしてカウントされます。したがって、次のように書くことができます。

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

これは、索引を計算して姓を索引付けするよりも、書きやすく、理解しやすいものです。

1)+=演算子を使用して文字列を追加できます。それ以外の

x = x + 'a'

あなたは書ける

x += 'a'

特定の問題に関するヘルプについては、以前の手紙を追跡する必要があります。割り当てに「2 つの '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()文字列に追加する前にそれを呼び出すコードを書きました。どちらでもいいのではないでしょうか。

幸運を!

于 2009-10-13T20:01:38.413 に答える