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

2024-05-20 23:27:26 发布

您现在位置: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没有。最好的检查方法是什么?在


^{pr2}$

Tags: and代码injsondataif字母code
1条回答
网友
1楼 · 发布于 2024-05-20 23:27:26

正如评论中所讨论的,这似乎是正则表达式的工作。所有可能的代码的实际细节似乎对您的任务没有太大的影响,您应该能够通过查看字符串的开头来区分大多数代码。在

在你的字典里定义他们各自的正则表达式。这应该让您开始:

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'])

几句话:

  • ^{}跳出最里面的for循环——在本例中,是根据当前代码检查所有已定义模式的循环。在我们找到一个匹配的之后,就没有必要再检查其他的了。在
  • ^{} clause of the ^{} loop有点特别,这是你不常看到的东西。如果循环通常以结束,for..else中的部分将被调用,这意味着它不是由break退出的。在我们的例子中,这意味着我们检查了所有的模式,但没有一个匹配-所以这可能是一个无效的构建代码,一个丢失的模式,一个不正确的模式。。。在
  • 我故意在PATTERNS字典的最后一个条目后面留下逗号。Python允许这样做,尽管这不是必需的,这太棒了。因为这意味着您可以轻松地复制和粘贴行来填充其余的模式,并将它们向上或向下移动,而不必总是删除/添加逗号。在

相关问题 更多 >