This commit is contained in:
2025-09-10 10:22:06 +08:00
parent 6a32f010d4
commit a15c6c1767
3 changed files with 136 additions and 132 deletions

View File

@@ -36,7 +36,7 @@ def load_jiancheng_data():
def load_yunnan_area_data():
"""加载云南省行政区划完整数据"""
"""加载云南省行政区划完整数据(非递归实现)"""
area_path = os.path.join(
os.path.dirname(os.path.dirname(__file__)),
'Dict',
@@ -53,26 +53,30 @@ def load_yunnan_area_data():
print(f"错误:{area_path} 文件格式不正确")
return {}
# 递归遍历所有行政区划节点
area_map = {}
# 1. 添加省级数据
province_name = data.get('name')
province_code = data.get('code')
if province_name and province_code:
area_map[province_name] = {'full_name': province_name, 'area_code': province_code}
def traverse_nodes(nodes):
if isinstance(nodes, list):
for node in nodes:
traverse_nodes(node)
elif isinstance(nodes, dict):
# 提取名称和代码
name = nodes.get('name')
code = nodes.get('code') or nodes.get('area_code')
if name and code:
area_map[name] = {'full_name': name, 'area_code': code}
# 2. 遍历城市和区县(非递归实现)
citys = data.get('citys', [])
for city in citys:
# 添加城市数据
city_name = city.get('name')
city_code = city.get('code')
if city_name and city_code:
area_map[city_name] = {'full_name': city_name, 'area_code': city_code}
# 处理子节点
children = nodes.get('children')
if children:
traverse_nodes(children)
# 添加区县数据
areas = city.get('areas', [])
for area in areas:
area_name = area.get('name')
area_code = area.get('code')
if area_name and area_code:
area_map[area_name] = {'full_name': area_name, 'area_code': area_code}
traverse_nodes(data)
return area_map
@@ -82,23 +86,22 @@ def query_area_info(query_str):
:param query_str: 简称或全称
:return: 包含full_name和area_code的字典未找到返回None
"""
# 修复:显式加载数据并初始化映射字典
abbrev_map, fullname_map = load_jiancheng_data()
yunnan_area_map = load_yunnan_area_data()
# 1. 先查简称映射表
if query_str in abbrev_map:
return abbrev_map[query_str]
# 2. 再查完整行政区划数据
# 1. 先查询完整行政区划数据(最重要修正)
if query_str in yunnan_area_map:
return yunnan_area_map[query_str]
# 3. 最后查全称映射表
# 2. 再查简称映射表(处理特殊名称)
if query_str in abbrev_map:
return abbrev_map[query_str]
# 3. 最后查全称映射表+模糊匹配
if query_str in fullname_map:
return fullname_map[query_str]
# 4. 尝试模糊匹配
# 4. 模糊匹配保持不变
for name, info in yunnan_area_map.items():
if query_str in name or name in query_str:
return info