Home07.The Flat Dictionary(扁平字典)

2016-03-15  本文已影响0人  Emvia

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.应用场景

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

上一篇下一篇

猜你喜欢

热点阅读