Home07.The Flat Dictionary(扁平字典)

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容