首页 > 解决方案 > 从嵌套的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

标签: pythonjsonlistdictionarydata-structures

解决方案


您可以使用递归来搜索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]]

推荐阅读