python 实现字典转换

发布于 2022-09-11 20:09:36 字数 636 浏览 39 评论 0

有下面的一道算法题,使用python实现,一直没有思路,请各位大神给一点思路好么

实现flatten函数,有如下功能:
nested_json = {
        "a": 1,
        "b": [35, 26],
        "c": [{
                "d": [2, 3, 4],
                "e": [
                    {
                        "f": 1,
                        "g": 2
                        }
                    ]
            }],
        "h": {}
        }
    
    flattened_json = flatten(nested_json)
        

    print(flattened_json)
    {'a': 1,
     'b.0': 35,
     'b.1': 26,
     'c.0.d.0': 2,
     'c.0.d.1': 3,
     'c.0.d.2': 4,
     'c.0.e.0.f': 1,
     'c.0.e.0.g': 2,
     'h': {}
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小苏打饼 2022-09-18 20:09:36

这道题不是考算法,而是考个人对python各种语法、函数的熟悉程度

# coding: utf-8
# __author__: 'Rich'

from __future__ import unicode_literals


def flatten(d, parent_key=None, out={}):
    for k, v in d.items():
        if not isinstance(v, list):
            key = '{}.{}'.format(parent_key, k) if parent_key else k
            out[key] = v
            continue

        for i, v1 in enumerate(v):
            key = '{}.{}.{}'.format(parent_key, k, i) if parent_key else '{}.{}'.format(k, i)
            if not isinstance(v1, dict):
                out[key] = v1
                continue

            flatten(v1, key, out)

    return out


nested_json = {
    "a": 1,
    "b": [35, 26],
    "c": [{
            "d": [2, 3, 4],
            "e": [
                {
                    "f": 1,
                    "g": 2
                    }
                ]
        }],
    "h": {}
}

flattened_json = flatten(nested_json)
print(flattened_json)
紫﹏色ふ单纯 2022-09-18 20:09:36

供参考.

代码:

#!/usr/bin/env python

from collections import namedtuple
from collections.abc import Iterable

Node = namedtuple("Node", ["keys", "value"])
Node.__new__.__defaults__ = ((), None)

def flattern(nested):
    def dfs(node):
        ks, nv = node
        if nv and isinstance(nv, Iterable):
            if type(nv) == list:
                kvs = enumerate(nv)
            elif type(nv) == dict:
                kvs = nv.items()
            for k, v in kvs:
                n = Node(keys=ks+(str(k),), value=v)
                yield from dfs(n)
        else:
            yield node

    root = Node(keys=(), value=nested)
    return {'.'.join(keys):value for keys, value in dfs(root)}

麻烦可以详细说一下你的需求吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文