Files
house/address_operation.py
T
2026-05-22 08:17:14 +08:00

125 lines
3.8 KiB
Python

import json
import os
from house.house_operation import read_houses
# 地址数据文件
ADDRESS_FILE = "./data/address_info.json"
# 邻接矩阵数据文件
GRAPH_FILE = "./data/adj_matrix.json"
def init_address_db():
"""初始化地址解析数据文件"""
os.makedirs("./data", exist_ok=True)
if not os.exists(ADDRESS_FILE):
with open(ADDRESS_FILE, 'w', encoding='utf-8') as f:
json.dump({}, f, ensure_ascii=False, indent=4)
def init_graph_db():
"""初始化小区邻接矩阵文件"""
os.makedirs("./data", exist_ok=True)
if not os.path.exists(GRAPH_FILE):
init_data = {
"communities": [],
"adj_matrix": []
}
with open(GRAPH_FILE, 'w', encoding='utf-8') as f:
json.dump(init_data, f, ensure_ascii=False, indent=4)
# ==================== 串操作:地址解析 ====================
def parse_address(address_str):
"""
串操作:拆分地址为 省/市/区/小区
时间复杂度:O(L) L为字符串长度
"""
address_str = address_str.strip()
# 按常见分隔符拆分
split_chars = ["省", "市", "区", "县", "街道", "路", "号", "小区"]
parts = []
temp = address_str
for char in split_chars:
if char in temp:
idx = temp.find(char)
parts.append(temp[:idx + 1])
temp = temp[idx + 1:]
if temp:
parts.append(temp)
# 标准化结构
result = {
"province": parts[0] if len(parts) >= 1 else "",
"city": parts[1] if len(parts) >= 2 else "",
"district": parts[2] if len(parts) >= 3 else "",
"community": parts[3] if len(parts) >= 4 else parts[-1] if parts else ""
}
return result
def save_address_info(house_id, address_info):
"""保存解析后的地址信息"""
init_address_db()
with open(ADDRESS_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
data[str(house_id)] = address_info
with open(ADDRESS_FILE, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def get_address_info(house_id):
"""获取房源解析后的地址"""
init_address_db()
with open(ADDRESS_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
return data.get(str(house_id), {})
# ==================== 数组操作:邻接矩阵 ====================
def add_community(community_name):
"""添加小区到图节点(数组维护)"""
init_graph_db()
with open(GRAPH_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
if community_name in data["communities"]:
return False
data["communities"].append(community_name)
n = len(data["communities"])
# 初始化新行新列(无穷大用 9999 表示)
for row in data["adj_matrix"]:
row.append(9999)
data["adj_matrix"].append([9999] * n)
# 自己到自己距离为0
data["adj_matrix"][-1][-1] = 0
with open(GRAPH_FILE, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
return True
def set_distance(community1, community2, distance):
"""设置两个小区之间的距离(邻接矩阵赋值)"""
init_graph_db()
with open(GRAPH_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
if community1 not in data["communities"] or community2 not in data["communities"]:
return False
i = data["communities"].index(community1)
j = data["communities"].index(community2)
data["adj_matrix"][i][j] = distance
data["adj_matrix"][j][i] = distance
with open(GRAPH_FILE, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
return True
def get_adj_matrix():
"""获取邻接矩阵与小区列表"""
init_graph_db()
with open(GRAPH_FILE, 'r', encoding='utf-8') as f:
return json.load(f)