美文网首页
Home07.The Flat Dictionary(扁平字典)

Home07.The Flat Dictionary(扁平字典)

作者: Emvia | 来源:发表于2016-03-15 21:44 被阅读0次

    0.题目

    尼古拉喜欢对一切看到的东西进行分类。 有一次,斯蒂芬送了他一个标签机作为他的生日礼物, 机器人把在船上的每个面的标签撕了几个星期。 从那时起,他归类在他的实验室的所有试剂, 图书馆的书和在桌子上笔记。 但后来他得知 python字典,并分类所有索菲亚的机器人的可能的配置。 现在,这些文件被组织在一个很深的嵌套结构, 但索菲亚并不喜欢这样。让我们帮助索菲亚扁平化这些字典。
    Python字典是一种可以用来方便地存储和处理配置的数据类型。它允许你通过键来创建嵌套结构来存储数据。您将得到一个字典,其中的键是字符串,值是字符串或字典。我们的目标是使字典扁平化,但保存的结构中的键。其结果应该是一个字典没有嵌套的字典。键应包含原来的字典中的父键的路径。在路径中的键是由以“/”分开。如果值是一个空的字典,那么它应该由一个空字符串("")所取代。
    让我们来看一个例子:

    {
       "name": {
           "first": "One",
           "last": "Drone"
        },
        "job": "scout",
        "recent": {},
        "additional": {
           "place": {
               "zone": "1",
               "cell": "2"}
       }
    }
    

    其结果将是:

    {"name/first": "One", #one parent
     "name/last": "Drone",
     "job": "scout", #root key
     "recent": "", #empty dict
     "additional/place/zone": "1", #third level
     "additional/place/cell": "2"}
    

    索菲亚已经写了这个任务的代码,但它有一个漏洞。 你需要找到并修复这个漏洞。
    **输入: **作为字典的一个原始字典。
    **输出: **作为字典的一个扁平化字典。
    范例:

    flatten({"key": "value"}) == {"key": "value"}
    flatten({"key": {"deeper": {"more": {"enough": "value"}}}}) == {"key/deeper/more/enough": "value"}
    flatten({"empty": {}}) == {"empty": ""}
    

    1.相关知识点

    1.1 列表内建方法

    list.pop(obj=list[-1]) # 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
    list.append(obj) # 在列表末尾添加新的对象。
    

    1.2 字符串内建方法

    str.join(sequence)  # 将序列中的元素以指定的字符连接生成一个新的字符串。
    

    1.3 字典更新方法

    dict["key"] = value # 指定对应键值和值。
    

    1.4 标准内建方法

    isinstance(object, classinfo) # 如果object是classinfo的一个实例或其任意超类的实例,则返回True。在Python 2.X中第二个参数也可以是类型对象,它使这个函数在两个Pythons中作为另外一个类型的检测工具(isinstance(X, Type)对type(X)是类型)。
    

    2.需要修改的源码

    def flatten(dictionary):
        stack = [((), dictionary)]
        result = {}
        while stack:
            path, current = stack.pop()
            for k, v in current.items():
                if isinstance(v, dict):
                    stack.append((path + (k,), v))
                else:
                    result["/".join((path + (k,)))] = v
        return result
    

    3.修正后的源码

    def flatten(dictionary):
        stack = [((), dictionary)]
        result = {}
        while stack:
            path, current = stack.pop()
            for k, v in current.items():
                if isinstance(v, dict):
                    if len(v) == 0:
                        result["/".join((path + (k,)))] = ""
                    else:
                        stack.append((path + (k,), v))
                else:
                    result["/".join((path + (k,)))] = v
        return result
    

    4.解法分析

    原版代码中未能对字典值是否为空进行判断,也未将空字典改为空字符串加入结果。
    增加判断字典是否为空,并将空字典改为空字符串值加入结果即可。

    5.应用场景

    在需要为保持系统和文件结构原状而分析配置文件,简化结构时会有用。 可以用自己的规格轻松地修改这个想法。 除此之外,它是一个能让人读懂代码和查找漏洞的有用的技能,。

    相关文章

      网友评论

          本文标题:Home07.The Flat Dictionary(扁平字典)

          本文链接:https://www.haomeiwen.com/subject/cmrqlttx.html