python - 从嵌套的dict python中获取数据并且数据类型也是混合的
问题描述
Json 数据如下所示,我必须获取给定数据中的坐标并将其列表打印为:
解:[[2, 3], [4, 1], [8, 4], [3, 2]]
数据 = '{"foo": {"type": "geo", "coords": [2, 3], "children": [{"type": "geo", "coords": [4, 1] ,“儿童”:[{“类型”:“酒吧”,“儿童”:[{“类型”:“地理”,“坐标”:[8, 4]}]},{“类型”:“地理” , "坐标": [3, 2]}]}]}}'
我想出了一个解决方案,但它有索引。无论dict的结构是什么,我都想要一些适用于每种情况的通用解决方案。可能吗?我是的然后怎么样?
我的解决方案是:
def fun(data):
coords_list = list()
data = json.loads(data)
for k in data:
if data[k].get('coords') is not None:
coords_list.append(data[k]['coords'])
if data[k].get('children') is not None:
if isinstance(data[k].get('children'), list):
coords = data[k].get('children')[0].get('coords')
coords_list.append(coords)
if isinstance(data[k].get('children')[0].get('children'), list):
coords = data[k].get('children')[0].get('children')[0].get('children')[0].get('coords')
coords_list.append(coords)
coords = data[k].get('children')[0].get('children')[1].get('coords')
coords_list.append(coords)
return coords_list
解决方案
您可以使用递归来搜索coords
:
import json
def get_coords(d):
if isinstance(d, dict):
for k, v in d.items():
if k == "coords":
yield v
yield from get_coords(v)
if isinstance(d, list):
for v in d:
yield from get_coords(v)
data = '{"foo": {"type": "geo", "coords": [2, 3], "children": [{"type": "geo", "coords": [4, 1], "children": [{"type": "bar", "children": [{"type": "geo", "coords": [8, 4]}]}, {"type": "geo", "coords": [3, 2]}]}]}}'
data = json.loads(data)
out = list(get_coords(data))
print("Solution:", out)
印刷:
Solution: [[2, 3], [4, 1], [8, 4], [3, 2]]
推荐阅读
- php - 最新 PHP 中的 AES GCM 是否损坏或者我做错了什么?
- coinbase-api - Coinbase 正文格式
- java - 如何区分它是以客户或船长/驾驶员身份登录的
- php - 如何告诉eclipse php linter变量存在?
- python - 我的代码有问题吗?我对结果有疑问
- javascript - 如何在鼠标单击事件中将复制的 html 内容从 chrome 扩展粘贴到浏览器主体(任何输入/文本区域框)?
- javascript - 使用 javascript 验证日期时间输入
- vb.net - 来自多组嵌套集合的 Linq 查询
- angular7 - 如何在 angular7 中添加多个对话框,使其返回到上一个对话框并反映父组件中的数据更改
- c - C - 仅包含特定功能