Home07.The Flat Dictionary(扁平字典)

0.題目

尼古拉喜歡對(duì)一切看到的東西進(jìn)行分類。 有一次,斯蒂芬送了他一個(gè)標(biāo)簽機(jī)作為他的生日禮物爬骤, 機(jī)器人把在船上的每個(gè)面的標(biāo)簽撕了幾個(gè)星期。 從那時(shí)起莫换,他歸類在他的實(shí)驗(yàn)室的所有試劑霞玄, 圖書館的書和在桌子上筆記骤铃。 但后來他得知 python字典,并分類所有索菲亞的機(jī)器人的可能的配置坷剧。 現(xiàn)在惰爬,這些文件被組織在一個(gè)很深的嵌套結(jié)構(gòu), 但索菲亞并不喜歡這樣听隐。讓我們幫助索菲亞扁平化這些字典补鼻。
Python字典是一種可以用來方便地存儲(chǔ)和處理配置的數(shù)據(jù)類型。它允許你通過鍵來創(chuàng)建嵌套結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù)雅任。您將得到一個(gè)字典风范,其中的鍵是字符串,值是字符串或字典沪么。我們的目標(biāo)是使字典扁平化硼婿,但保存的結(jié)構(gòu)中的鍵。其結(jié)果應(yīng)該是一個(gè)字典沒有嵌套的字典禽车。鍵應(yīng)包含原來的字典中的父鍵的路徑寇漫。在路徑中的鍵是由以“/”分開。如果值是一個(gè)空的字典殉摔,那么它應(yīng)該由一個(gè)空字符串("")所取代州胳。
讓我們來看一個(gè)例子:

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

其結(jié)果將是:

{"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"}

索菲亞已經(jīng)寫了這個(gè)任務(wù)的代碼,但它有一個(gè)漏洞逸月。 你需要找到并修復(fù)這個(gè)漏洞栓撞。
**輸入: **作為字典的一個(gè)原始字典。
**輸出: **作為字典的一個(gè)扁平化字典碗硬。
范例:

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

1.相關(guān)知識(shí)點(diǎn)

1.1 列表內(nèi)建方法

list.pop(obj=list[-1]) # 移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素)瓤湘,并且返回該元素的值。
list.append(obj) # 在列表末尾添加新的對(duì)象恩尾。

1.2 字符串內(nèi)建方法

str.join(sequence)  # 將序列中的元素以指定的字符連接生成一個(gè)新的字符串弛说。

1.3 字典更新方法

dict["key"] = value # 指定對(duì)應(yīng)鍵值和值。

1.4 標(biāo)準(zhǔn)內(nèi)建方法

isinstance(object, classinfo) # 如果object是classinfo的一個(gè)實(shí)例或其任意超類的實(shí)例翰意,則返回True木人。在Python 2.X中第二個(gè)參數(shù)也可以是類型對(duì)象,它使這個(gè)函數(shù)在兩個(gè)Pythons中作為另外一個(gè)類型的檢測(cè)工具(isinstance(X, Type)對(duì)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.解法分析

原版代碼中未能對(duì)字典值是否為空進(jìn)行判斷虎囚,也未將空字典改為空字符串加入結(jié)果。
增加判斷字典是否為空蔫磨,并將空字典改為空字符串值加入結(jié)果即可。

5.應(yīng)用場(chǎng)景

在需要為保持系統(tǒng)和文件結(jié)構(gòu)原狀而分析配置文件圃伶,簡(jiǎn)化結(jié)構(gòu)時(shí)會(huì)有用堤如。 可以用自己的規(guī)格輕松地修改這個(gè)想法蒲列。 除此之外,它是一個(gè)能讓人讀懂代碼和查找漏洞的有用的技能搀罢,蝗岖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市榔至,隨后出現(xiàn)的幾起案子抵赢,更是在濱河造成了極大的恐慌,老刑警劉巖唧取,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铅鲤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枫弟,警方通過查閱死者的電腦和手機(jī)邢享,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淡诗,“玉大人骇塘,你說我怎么就攤上這事『荩” “怎么了款违?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)群凶。 經(jīng)常有香客問我插爹,道長(zhǎng),這世上最難降的妖魔是什么座掘? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任递惋,我火速辦了婚禮,結(jié)果婚禮上溢陪,老公的妹妹穿的比我還像新娘萍虽。我一直安慰自己,他們只是感情好形真,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布杉编。 她就那樣靜靜地躺著,像睡著了一般咆霜。 火紅的嫁衣襯著肌膚如雪邓馒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天蛾坯,我揣著相機(jī)與錄音光酣,去河邊找鬼。 笑死脉课,一個(gè)胖子當(dāng)著我的面吹牛救军,可吹牛的內(nèi)容都是我干的财异。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼唱遭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼戳寸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拷泽,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤疫鹊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后司致,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拆吆,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垛叨。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盒至,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布缝彬,位于F島的核電站,受9級(jí)特大地震影響哺眯,放射性物質(zhì)發(fā)生泄漏谷浅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一奶卓、第九天 我趴在偏房一處隱蔽的房頂上張望一疯。 院中可真熱鬧,春花似錦夺姑、人聲如沸墩邀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眉睹。三九已至,卻和暖如春废膘,著一層夾襖步出監(jiān)牢的瞬間竹海,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國打工丐黄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斋配,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像许起,于是被迫代替她去往敵國和親十偶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菩鲜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容