Python-给出前四个字符的美国各州的完整名称?

时间:2013-11-21 03:05:11

标签: python

我有美国各州的前四/五个字符列表 - 即马萨诸塞州将是“Mass”或“Massa”,加利福尼亚州将是“Calif”或“Cali”,或缩写为“N.J.”或“N.Y.”我需要国家的全名。实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

制作一个字典,将4个字符的州名映射为完整的名称。

>>> complete_names = 'Massachusetts', 'California', 'New York', 'New Jersey',
>>> states = {state[:4]: state for state in complete_names}
>>> states.update({''.join(c[0] + '.' for c in state.split()): state for state in complete_names} )
>>> states['Mass']
'Massachusetts'
>>> states['Cali']
'California'
>>> states['N.Y.']
'New York'

如果名称超过4个字符,请将其切成4个字符。

>>> states['Calif']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Calif'
>>> states['Calif'[:4]]
'California'

答案 1 :(得分:2)

您想要一个将所有缩写映射到全名的字典。

看起来你实际上有三种缩写。但这不是问题;只需单独生成所有三种词典,然后将它们与update合并在一起。

state_abbrev = {state[:4]: state for state in states}
state_abbrev.update({state[:5]: state for state in states})
state_abbrev.update({'.'.join(filter(str.isupper, state))+'.': state 
                     for state in states})

最后一个可能有点过于聪明,所以让我分解来解释一下:

>>> state = 'New York'
>>> caps = filter(str.isupper, state)
>>> caps
['N', 'Y']
>>> '.'.join(caps)
'N.Y'
>>> '.'.join(caps) + '.'
'N.Y.'

这里有一些含糊之处,但它们是你问题所固有的:

  • Mississippi和Missouri有相同的四个字母前缀。因此,Miss将任意映射到其中一个。新墨西哥州,新泽西州和纽约州也存在同样的问题。而北达科他州与北卡罗来纳州及其南部邻居甚至拥有相同的五个字母前缀。
  • 许多单字州名都有相同的缩写:缅因州,马萨诸塞州,密西西比州,密苏里州,明尼苏达州和密歇根州都是M.,所以这将是任意地映射到其中一个。

希望您的代码中不会出现这些含糊不清的前缀或缩写,因此它们被映射到任意内容的事实永远不会重要。如果你想在这些情况下引发错误,那么添加一个阻止任何模糊条目的规则,或者一个需要两个单词作为缩写的规则,或者......无论你想添加什么,都不是太难。

答案 2 :(得分:1)

让我提出第三种选择你可以在缩写中找到完整州名的字典。

>>> states = { "Georgia" : "GA", "New Jersey": "NJ"}

然后,您可以使用正则表达式从您正在抓取的原始数据中提取字母。您现在必须检查提取的数据是否在字典键中,或者是键本身的值。

>>> import re
>>> rawState = "N.J."
>>> toFind = "".join(re.findall("[a-zA-Z]+", rawState))
>>> for state in states:
...     if toFind in state or toFind in states[state]:
...             print state
... 
New Jersey

相同但不同的rawState

>>> rawState = "Georg"
>>> toFind = "".join(re.findall("[a-zA-Z]+", rawState))
>>> for state in states:
...     if toFind in state or toFind in states[state]:
...             print state
... 
Georgia

事后看来,我应该把它变成像findState(rawState)这样的函数。