可以使用这个soundex编码的一些帮助

时间:2009-10-13 19:31:28

标签: python soundex

美国人口普查局使用一种名为“soundex”的特殊编码来查找有关某人的信息。 soundex是姓氏(姓氏)的编码,基于姓氏的方式而不是拼写的方式。听起来相同,但拼写不同的姓氏,如SMITH和SMYTH,具有相同的代码并一起归档。开发了soundex编码系统,以便您可以找到一个姓氏,即使它可能已被记录在各种拼写中。

在本实验中,您将设计,编码和记录在输入姓氏时生成soundex代码的程序。系统将提示用户输入姓氏,程序应输出相应的代码。

基本Soundex编码规则

姓氏的每个soundex编码都包含一个字母和三个数字。使用的字母始终是姓氏的第一个字母。根据下面显示的soundex指南,将数字分配给姓氏的其余字母。如果需要,最后添加零以始终生成四字符代码。其他信件被忽略。

Soundex编码指南

Soundex为各种辅音分配一个数字。听起来相似的辅音被赋予相同的数字:

号码辅音

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

Soundex忽略字母A,E,I,O,U,H,W和Y.

遵循3个额外的Soundex编码规则。一个好的程序设计会将这些作为一个或多个单独的函数来实现。

规则1.带双字母的姓名

如果姓氏有双字母,则应将其视为一个字母。例如:

  • Gutierrez编码为G362(G为3,T为6,第一个R为6,忽略第二个R,Z为2)。

规则2.带有相同Soundex代码编号的字母名称

如果姓氏在soundex编码指南中具有相同数字并排的不同字母,则应将其视为一个字母。例子:

  • Pfister编码为P236(P,F被忽略,因为它被认为与P相同,S为2,T为3,R为6)。

  • 杰克逊被编码为J250(J,2代表C,K忽略与C相同,S忽略与C相同,5代表N,0添加)。

规则3.辅音分隔符

3.A。如果元音(A,E,I,O,U)分离具有相同soundex代码的两个辅音,则对元音右侧的辅音进行编码。例如:

  • Tymczak编码为T-522(T为5,M为2,C为2,Z忽略(参见上文“并排”规则),K为2)。由于元音“A”将Z和K分开,因此K被编码。

3.B。如果“H”或“W”将两个具有相同soundex代码的辅音分开,则右边的辅音不被编码。例如:

* Ashcraft编码为A261(A,2为S,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

代码充分满足了它的要求,我只是不确定如何编写这三个规则。这是我需要帮助的地方。所以,任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:0)

一些提示:

  • 通过使用一个数组,其中每个Soundex代码都存储并通过它所对应的字母的ASCII值(或由其衍生的较短数值范围中的值)进行索引,您将使代码生效并且更具可读性。这是一种非常常见的技术:理解,使用和重用; - )

  • 在解析输入字符串时,您需要跟踪(或比较)先前处理的字母以忽略重复字母,并处理其他规则。 (在写入中暗示的单独功能中实现这些中的每一个)。这个想法可能是引入一个负责的函数 - 可能 - 为正在处理的输入的当前字母添加soundex代码。此函数将依次调用每个“规则”函数,可能会根据某些规则的返回值提前退出。换句话说,取代系统......

    outstring = outstring + c    # btw could be +=
...with
    outstring += AppendCodeIfNeeded(c)
  • 要注意这种多功能结构对于这种微不足道的逻辑来说是过度的,但实践它并不是一个坏主意。

答案 1 :(得分: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()。无论哪种方式都可能没问题。

祝你好运!