检查值是否在字母数字值范围内

时间:2014-09-17 18:54:47

标签: python

对于这个编码练习,我应该列出一个字母数字建筑代码列表,并输出相应的代码描述信息的json数据 - 相关数据列在我的函数下面。我知道我的解决方案并不好,但我是一个菜鸟,我不知道该怎么做。

def return_code(code):
    """takes in a list of codes and returns a json dictionary of codes and corresponding      
    descriptions"""
     data = []
     for c in code:
         if c.startswith("M") and "R" in c:
              #gets mixed Res and Manufacturing districts

            data.append({"code": c, "description": "Mixed Manufacturing & Residential 
            Districts"})
        if c.startswith("M") and "R" not in c:
            data.append({"code": c, "description": "Manufacturing Districts"})
        if c.startswith("R"):
            data.append({"code": c, "description": "Residential Districts"})
        if c.startswith("ZR"):
            data.append({"code": c, "description": "Special Zoning District"})          
        if c == "ZNA":
            data.append({"code": c, "description": "Zoning Not Applicable"})
        if c == "BPC":
             data.append({"code": c, "description": "Battery Park City"})
        if c == "PARK":
            data.append({"code": c, "description": "New York City Parks"})
        if c == "PARKNYS":
            data.append({"code": c, "description": "New York State Parks"})
        if c == "PARKUS":
            data.append({"code": c, "description": "United States Parks"})
        if c.startswith("ZR"):
             data.append({"code": c, "description": "Special Zoning District"})
        else:
            pass
    return json.dumps(data)

如下所示,例如,R1-1和R10H之间的任何代码都是'住宅'但我不确定如何检查一个值是否落在这些字母数字值之间?我想到使用所有代码的字典和相应的信息,但在这种情况下,格式是不同的。 R1-1有短划线而R10H没有。检查这个的最佳方法是什么?


Description Data:
Codes               Descriptions
---------------------------------------------------------------
R1-1 - R10H         Residential Districts
C1-6 - C8-4         Commercial Districts
M1-1 - M3-2         Manufacturing Districts
M1-1/R5 – M1-6/R10  Mixed Manufacturing & Residential Districts
BPC                 Battery Park City
PARK                New York City Parks
PARKNYS             New York State Parks
PARKUS              United States Parks
ZNA                 Zoning Not Applicable
ZR 11-151           Special Zoning District

1 个答案:

答案 0 :(得分:0)

正如评论中所讨论的,这似乎是正则表达式的工作。所有可能的代码的实际细节似乎对你的任务来说太重要了,你应该能够通过查看字符串的开头来解决大部分问题。

我建议您在词典中定义正则表达式,并将它们映射到各自的描述中。这应该让你开始:

import json
import re


PATTERNS = {
    '^R1??':      "Residential Districts",
    'C\d-\d':     "Commercial Districts",
    'M\d-\d$':    "Manufacturing Districts",
    'M1-\d/R\d*': "Mixed Manufacturing & Residential Districts",
    # ...
}


def return_code(codes):
    """takes in a list of codes and returns a json dictionary of codes
    and corresponding descriptions
    """
    descriptions = []
    for code in codes:
        for pattern, desc in PATTERNS.items():
            if re.match(pattern, code):
                descriptions.append({"code": code, "description": desc})
                # We found a matching pattern, no need to test the others
                break
        else:
            print "Code '%s' did not match any pattern!" % code
    return json.dumps(descriptions)

print return_code(['M1-1', 'ZNA'])

一对夫妇注意到:

  • break突破了最内层的for循环 - 在这种情况下,循环会根据当前代码检查所有已定义的模式。在我们找到匹配之后,检查其他任何内容都没有意义。
  • else clause of the for loop有点特别,这是你经常看不到的东西。如果循环正常,则会调用for..else中的部分,这意味着它不会被break退出。在我们的情况下,这意味着我们经历了所有模式,但没有一个匹配 - 因此可能是无效的构建代码,缺少模式,不正确的模式,......
  • 我故意在PATTERNS字典中的最后一个条目之后留下尾随逗号。 Python允许这样做,即使它没有必要,而且非常棒。因为这意味着您可以轻松地复制和粘贴线条以填充其余图案,并向上或向下移动它们,而无需始终删除/添加逗号。