首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查某个值是否在字母数字值的范围内

检查某个值是否在字母数字值的范围内
EN

Stack Overflow用户
提问于 2014-09-17 18:54:46
回答 1查看 571关注 0票数 0

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

代码语言:javascript
复制
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没有。检查这个的最好方法是什么?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-18 00:37:13

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

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

代码语言:javascript
复制
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循环--在本例中,是根据当前代码检查所有定义的模式的循环。在我们找到一个匹配的,没有必要检查任何其他。
  • loop有点特别,它是你不经常看到的。如果循环正常结束,for..else中的部分将被调用,这意味着它没有被break退出。在我们的例子中,这意味着我们遍历了所有的模式,但是没有一个模式匹配--所以这可能是一个无效的建筑代码,一个缺失的模式,一个不正确的模式,.
  • PATTERNS字典的最后一个条目之后,我故意留下了后缀逗号。Python允许这样做,尽管它不是必要的,而且非常棒。因为这意味着您可以轻松地复制和粘贴行以填充其余的模式,并将其向上或向下移动,而不必总是删除/添加逗号。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25898246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档