在这个编码练习中,我应该输入一个字母数字建筑代码列表,并输出包含相应代码描述信息的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发布于 2014-09-18 00:37:13
正如注释中所讨论的,这似乎是正则表达式的一项工作。所有可能的代码的实际细节似乎对您的任务没有太大的影响,您应该能够通过查看字符串的开头来区分其中的大多数代码。
我建议在字典中定义正则表达式,并将它们映射到它们各自的描述中。这应该会让你开始:
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循环--在本例中,是根据当前代码检查所有定义的模式的循环。在我们找到一个匹配的,没有必要检查任何其他。for..else中的部分将被调用,这意味着它没有被break退出。在我们的例子中,这意味着我们遍历了所有的模式,但是没有一个模式匹配--所以这可能是一个无效的建筑代码,一个缺失的模式,一个不正确的模式,.PATTERNS字典的最后一个条目之后,我故意留下了后缀逗号。Python允许这样做,尽管它不是必要的,而且非常棒。因为这意味着您可以轻松地复制和粘贴行以填充其余的模式,并将其向上或向下移动,而不必总是删除/添加逗号。https://stackoverflow.com/questions/25898246
复制相似问题