对于这个编码练习,我应该列出一个字母数字建筑代码列表,并输出相应的代码描述信息的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
答案 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允许这样做,即使它没有必要,而且非常棒。因为这意味着您可以轻松地复制和粘贴线条以填充其余图案,并向上或向下移动它们,而无需始终删除/添加逗号。