【问题标题】:Could use some help with this soundex coding可以对这个 soundex 编码使用一些帮助
【发布时间】:2009-10-13 19:31:28
【问题描述】:

美国人口普查局使用一种称为“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 3D,T 4升 5M,N 6转

Soundex 忽略字母 A、E、I、O、U、H、W 和 Y。

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

规则 1. 使用双字母的名称

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

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

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

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

  • 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 代码的辅音,则元音右侧的辅音被编码。示例:

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

3.b。如果 "H" 或 "W" 分隔两个具有相同 soundex 代码的辅音,则右侧的辅音不被编码。示例:

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

代码充分满足了它的要求,我只是不确定如何编写这三个规则。那就是我需要帮助的地方。因此,感谢您的帮助。

【问题讨论】:

  • 请注意,家庭作业说好的设计会使用函数。这个菜谱在这个特定的作业上不会得到好成绩... :-) 也就是说,这个菜谱可能会返回正确的答案,并且可能有助于检查作业代码是否正常工作。
  • IT 似乎没有实施规则 3b。
  • 规则 3b 并不经常实施。没有通用的 Soundex 算法之类的东西。 OP 引用的规则取自美国国家档案馆的网页,完全忽略了人口普查局在两次人口普查之间更改规则的事实。

标签: python soundex


【解决方案1】:

这里有一些关于一般 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()。无论哪种方式都可能没问题。

祝你好运!

【讨论】:

    【解决方案2】:

    一些提示:

      1234563更具可读性。这是一种非常常见的技术:理解、使用和重用 ;-)
    • 在解析输入字符串时,您需要跟踪(或比较)先前处理的字母以忽略重复字母,并处理其他规则。 (如文章中所暗示的,在单独的函数中实现这些中的每一个)。这个想法可能是引入一个函数来负责 -maybe- 为正在处理的输入的当前字母添加 soundex 代码。该函数将依次调用每个“规则”函数,可能会根据某些规则的返回值提前退出。也就是说,替换系统...

    outstring = outstring + c # btw 可能是 += ...和 outstring += AppendCodeIfNeeded(c)
    • 请注意,这种多功能结构对于这种琐碎的逻辑来说太过分了,但实践一下也不错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多