json - 将此 JSON 转换为树并找到父级的路径
问题描述
data= {
"saturn": [
"planet",
"american_car",
"car"
],
"american_car": [
"car",
"gas_driven_automobile"
],
"planet": [
"large_object",
"celestial_body"
],
"large_object": [],
"gas_driven_automobile": [
"gas_powered_road_vehicle",
"car"
],
"car": [
"vehicle",
"motor_vehicle"
],
"vehicle": [],
"motor_vehicle": [],
"gas_powered_road_vehicle": [],
"celestial_body": []
};
我需要编写一个算法,如果我输入“土星”,我需要获得从土星到不同父母的所有可能路径。例如,
saturn ->planet ->large_object
saturn ->american_car->car->vehicle
saturn ->american_car->car->motor_vehicle
saturn ->american_car->gas_driven_automobile->gas_powered_road_vehicle
saturn ->american_car->gas_driven_automobile->car->vehicle
以及所有其他可能的路径。
我正在考虑以某种方式将其转换为树,然后使用库来计算从子节点到父节点的路径。
正在编写算法,无法弄清楚如何开始将其转换为树。
解决方案
使用jq,您可以简单地定义一个递归函数:
def parents($key):
if has($key)
then if .[$key] == [] then [] else .[$key][] as $k | [$k] + parents($k) end
else []
end;
要使用它来产生“->”样式的输出,请使用 -r 命令行选项调用 jq,然后像这样调用上述函数:
["saturn"] + parents("saturn")
| join(" -> ")
更经济
def lineages($key):
[$key] + (lineages(.[$key][]) // []);
lineages("saturn") | join(" -> ")
推荐阅读
- c# - 虽然我在反序列化 xml 时忽略了命名空间,但它不会忽略根节点的命名空间
- javascript - 我在 Firefox 上出现这样的错误“可下载字体:被消毒剂拒绝”
- swiftui - 嵌套 ObservedObject 中的更改不会更新 UI
- spring-boot - EntityExistsException:具有相同标识符值的不同对象已与会话关联
- c# - 使用 Nim 生成用于 C#/VB6 的 DLL
- python - 如何从现有列表创建嵌套字典?
- cron - 从不和谐服务器中提取信息
- django - 如何让多个视图可以访问 Django 的“上下文”变量?
- c# - 更改前缀命名空间 WCF 信封请求
- java - Java中泛型类类型的转换和数组