美国人口普查局使用一种名为“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.带双字母的姓名
如果姓氏有双字母,则应将其视为一个字母。例如:
规则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代码的两个辅音,则对元音右侧的辅音进行编码。例如:
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
代码充分满足了它的要求,我只是不确定如何编写这三个规则。这是我需要帮助的地方。所以,任何帮助都表示赞赏。
答案 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()
。无论哪种方式都可能没问题。